1.throwオペレーター

例外がブロックによってキャッチされてから、それが Java マシンにスローされるまでは、それは単なる継承(またはむしろ)catchオブジェクトです。例外オブジェクト自体には魔法のプロパティはありません。ExceptionThrowable

例外がどのように機能するかのロジックはすべて、例外がスローされたときに Java マシンが動作する特別な方法にすぎません。

キャッチした例外はいつでも Java マシンに再スローできます。これを行うには、throw次の演算子を使用する必要があります。

throw exception;

例:

コード コンソール出力
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

このコードでは、例外をキャッチし、それに関するメッセージを画面に表示し、それを再スローしました。

catch再スローされた例外は、同じブロック内の他のブロックではキャッチできませんtry


2. あなたの例外

ちなみに、例外オブジェクトを自分で作成することもできます。例外オブジェクトは、型が であるオブジェクトException、またはそれを継承するクラスにすぎません。そして投げます。

思ったよりも簡単です。例:

コード コンソール出力
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

上の例では、型が である新しい例外オブジェクトを作成しRuntimeException、演算子を使用してすぐにそれをスローしましたthrow

catchRuntimeException は を継承するため、ブロックによってすぐに捕捉されますException。このcatch (Exception except)コードは、クラスを継承するすべてのクラスの例外オブジェクトをキャッチしますException



3.finallyキーワード

もう一つ重要な点があります。プログラマは、コード内で例外が発生したかどうかに関係なく、何らかのアクションを実行する必要がある場合があります。たとえば、書き込み用にファイルを開いたとします。開いたファイルは、を呼び出して閉じる必要がありますclose()

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

これらの必須アクションを実行するために、別の種類のブロック ( finally) が構成に追加されtry-catch、それによってtry-catch-finally構成が作成されました。次のようになります。

例:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

finallyブロック内のコードは、 例外が発生したかどうかに関係なく、どのような場合でも実行されます。例外がスローされてキャッチされなかった場合でも、finallyブロックは実行されます。

ちなみに、例外をキャッチしたくないがブロックが必要な場合は、構成finallyの短縮表記であるブロックを使用します。次のようになります。try-catch-finallytry-finally

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}