8

違いは何ですか

try {
     // action A
}
catch(Exception e) {
     // action B
}
finally {
     // action C
}

try {
     // action A
}
catch(Exception e) {
     // action B
}
// action C

catchブロック内から戻ってもブロックを実行できることを読みましたfinally。他に違いはありますか?

4

6 に答える 6

9

ブロック内でfinally発生することは、try-catch-block で何が発生しても発生することが保証されています。(さまざまなsなどのExceptionextendsなど)によってカプセル化されていない例外が発生した場合でも、ブロックは実行されます。ThrowableErrorfinally

1 つ注意してください。finallyブロック内で aRuntimeExceptionがスローされるか、別のものがそのブロックException内からエスケープされると、ブロックの残りの部分は実行されません。また、Torgamus卿が指摘したように、JVMの実行に依存しています。さらに、おそらく明らかに、スレッドが停止していないことも条件となります。finally

于 2011-04-29T15:45:13.737 に答える
5

既存の回答のほとんどには正しい回答の一部が含まれていますが、完全に正確なものはありません。

ブロックは常にブロックの後に到達finallyすることが保証されており、JVMが事前にシャットダウンしない場合はブロックされる可能性があります。ただし、ブロック内のコードの一部がJVMをシャットダウンしたり、独自の例外をスローしたりすると、ブロックの最後に到達しない可能性があります。trycatchfinally

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に入力されます。

于 2011-04-29T15:51:34.807 に答える
2

この例をよく見ると、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ブロックにその使用法があります

于 2011-04-29T15:51:56.487 に答える
1

Sunチュートリアルから

注:tryまたはcatchコードの実行中にJVMが終了すると、finallyブロックは実行されません。同様に、tryまたはcatchコードを実行しているスレッドが中断または強制終了された場合、アプリケーション全体が続行されても、finallyブロックは実行されません。

finallyブロックが実行されない他の方法を私は知りません...

于 2011-04-29T15:51:23.683 に答える
0

例外処理には try ブロックが使用されます。例外をスローするケース/コードがある場合、たとえば、数値を Zero(0) で除算すると、例外がスローされ、プロセスがシャットダウンされます。この場合、コードを try ブロックに入れると、catch ブロックによって例外がキャッチされ、プロセスは終了しません。そして、finally ブロックは、そこに書かれたコードの実行を保証します。したがって、プロセスの実行が成功したかどうかにかかわらず、プロセスを終了/クローズする必要がある場合 (たとえば、ネットワーク プログラミングの場合、他のデバイスがその接続を使用できるように、最後に接続を解放する必要があります)、finally ブロックを使用します。

于 2011-04-29T16:46:05.960 に答える
0

ブロック内のコードfinallyは、JVM が引き続き実行された場合に実行されることが保証されます。

これは、アクション B にあるものが別の新しい例外をスローしたり、アクション A で例外をキャッチしたり、return が呼び出されたりしても、アクション C のコードが実行されることを意味します。

于 2011-04-29T15:44:32.570 に答える