違いは何ですか
try {
// action A
}
catch(Exception e) {
// action B
}
finally {
// action C
}
と
try {
// action A
}
catch(Exception e) {
// action B
}
// action C
catch
ブロック内から戻ってもブロックを実行できることを読みましたfinally
。他に違いはありますか?
ブロック内でfinally
発生することは、try-catch-block で何が発生しても発生することが保証されています。(さまざまなsなどのException
extendsなど)によってカプセル化されていない例外が発生した場合でも、ブロックは実行されます。Throwable
Error
finally
1 つ注意してください。finally
ブロック内で aRuntimeException
がスローされるか、別のものがそのブロックException
内からエスケープされると、ブロックの残りの部分は実行されません。また、Torgamus卿が指摘したように、JVMの実行に依存しています。さらに、おそらく明らかに、スレッドが停止していないことも条件となります。finally
既存の回答のほとんどには正しい回答の一部が含まれていますが、完全に正確なものはありません。
ブロックは常にブロックの後に到達finally
することが保証されており、JVMが事前にシャットダウンしない場合はブロックされる可能性があります。ただし、ブロック内のコードの一部がJVMをシャットダウンしたり、独自の例外をスローしたりすると、ブロックの最後に到達しない可能性があります。try
catch
finally
Sun Certified Programmer for Java 6学習ガイドによると:
finally
-will-always-be-calledルールの唯一の例外finally
は、JVMがシャットダウンした場合にaが呼び出されないことです。呼び出されたから
finally
といって、それが完了するとは限りません。
最後の言葉は、いつものように、Java言語仕様です。の動作は、 §14.20.2try-catch-finallyの実行でfinally
徹底的に説明されています。
補足として:あなたは正しいですが、return
の実行try
が停止することはありませんfinally
。実際にfinally
は、が検出された直後、実行される前return
に入力されます。
この例をよく見ると、Excpetionを返したり伝播したりしても、リソースは常に閉じられています。
try {
//action A
return 0;
} catch (Exception e){
//action C
throw new Excpetion("Probleme here",e)
} finnaly {
//action C
resources.close();
}
アクションAとbeがinta= 0と同じくらい原始的である場合、違いはありませんが、このようなより複雑な状況では、finnalyブロックにその使用法があります
注:tryまたはcatchコードの実行中にJVMが終了すると、finallyブロックは実行されません。同様に、tryまたはcatchコードを実行しているスレッドが中断または強制終了された場合、アプリケーション全体が続行されても、finallyブロックは実行されません。
finallyブロックが実行されない他の方法を私は知りません...
例外処理には try ブロックが使用されます。例外をスローするケース/コードがある場合、たとえば、数値を Zero(0) で除算すると、例外がスローされ、プロセスがシャットダウンされます。この場合、コードを try ブロックに入れると、catch ブロックによって例外がキャッチされ、プロセスは終了しません。そして、finally ブロックは、そこに書かれたコードの実行を保証します。したがって、プロセスの実行が成功したかどうかにかかわらず、プロセスを終了/クローズする必要がある場合 (たとえば、ネットワーク プログラミングの場合、他のデバイスがその接続を使用できるように、最後に接続を解放する必要があります)、finally ブロックを使用します。
ブロック内のコードfinally
は、JVM が引き続き実行された場合に実行されることが保証されます。
これは、アクション B にあるものが別の新しい例外をスローしたり、アクション A で例外をキャッチしたり、return が呼び出されたりしても、アクション C のコードが実行されることを意味します。