3

I have a snippet as follows:

try
{
   //blah!!
} 
catch(IOException e)
{
   throw new RuntimeException(e);
}

I do not understand how the above works? Will it catch an IOException and when it does that will it throw a RuntimeException? In that case the IOException will not have any meaning right? Some example would help.

4

6 に答える 6

2

いくつかの仮定については正しいですが、もう少し深くする必要があります。ブロック内tryで、クラスのメソッドの 1 つがこの種の例外をスローするとしますIOException。したがって、catch は、こ​​の例外的なケースを処理する方法として機能します。基本的にこれです。RuntimeException を使用して例外を破棄した場合でも、そのようにラップすると、例外はまったく失われませんIOExceptionRuntimeException

通常の使用は、より高いレベルで例外を扱います。例外処理に関する優れたチュートリアルを次に示します。確認してください:例外処理のベスト プラクティス

于 2012-08-02T19:23:06.933 に答える
1

このコードでは、チェックされた IOException が事実上チェックされなくなります。IOException を RuntimeException に渡すことで、2 つを連鎖させます。

于 2012-08-02T19:21:53.027 に答える
1

はい、あなたの理解は正しいです。これは、Java が提供する例外ではなく、アプリケーション固有の例外を表示する場合に役立ちます (IOException は、これを理解するのに最適なケースではない可能性があります)。

于 2012-08-02T19:21:56.997 に答える
1

チェックExceptionsされたものは、キャッチするか、スローされたと宣言する必要があります。 RuntimeExceptionsしないので、 a としてキャッチして再スローRuntimeExceptionすることで、宣言する必要がなくなります。

public void myMethod() throws IOException

throw new RuntimeException(e);呼び出されると、新しい例外が作成されてスローされますが、元の例外はその中にラップされます。したがって、スタック トレースは次のようになります。

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Some error.
    at com...main(SomeClass.java:36)
Caused by: java.io.IOException: Some error.

したがって、コール スタックを上る実際の例外は a でしたRuntimeExceptionが、元の例外IOExceptionは根本原因としてメッセージに保持されます。

于 2012-08-02T19:21:57.480 に答える
1

あなたの理解は正しいです。IOExceptionがスローされた場合、catchハンドラーはそれをキャッチし、すぐに独自の をスローしRuntimeExceptionます。この例外は、プログラムの他の場所でキャッチされる可能性があります。その場合、制御はハンドラーで取得されるか、キャッチされずに現在のスレッドが終了します。

ここで何が起こっているかを考える 1 つの方法は、次のとおりIOExceptionです。チェックされた例外は、キャッチする必要があることを意味します。キャッチされない場合、プログラムはコンパイルされません。上記のコードは、 をキャッチするたびに、未チェックの例外であるIOExceptionをスローすることを示しています。RuntimeExceptionプログラマーがキャッチしたくない場合は、この例外をキャッチする必要はありません。RuntimeExceptionこれは、パラメーターとしてcatch を使用して構築されていることに注意しIOExceptionてください。これは、RuntimeExceptionが後でキャッチされた場合、それをキャッチした人は誰でも、根本的な理由が であったことに気づき、IOExceptionそれに応じて処理できることを意味します。

お役に立てれば!

于 2012-08-02T19:22:13.313 に答える
1

いいえ。RuntimeException には特別なものがあります。throws RuntimeExceptionRuntimeException をスローする場合、メソッド シグネチャには必要ありません。これを非チェック例外と呼びます。このコードは IOException を RuntimeException にラップし、それを呼び出し元に再スローします。これは、ほとんどの場合、私見では悪いアプローチです。

IllegalArgumentException、NullPointerException などのように、RuntimeException のすべてのサブクラスはチェックされません。

于 2012-08-02T19:22:28.820 に答える