2010-11-24 8 views
100

catchブロックが実行され、2番目の例外がスローされた場合でも、このコードでsomeVarを設定しますか?新しい例外をスローした場合でもfinallyブロックは実行されますか?

public void someFunction() throws Exception { 
    try { 
     //CODE HERE 
    } catch (Exception e) { 
     Log.e(TAG, "", e); 
     throw new Exception(e); 
    } finally { 
     this.someVar= true; 
    } 
} 
+2

@GaryF – jax

+1

で示されているように、動作が予期していない場合があるため、例外をスローした場合や返された場合、最終ブロックが期待どおりに実行されない可能性があります。 –

答えて

128

はい、finallyブロックは常にときを除いて...実行されます。

  • のtry-catch-finallyブロックは、あなたがSystem.exit(0);
  • 基礎となるVMがあるを使用して殺したか
  • を中断さを実行しているスレッド他の方法で破壊された
  • 基盤となるハードウェアは、いくつかの方法

加えて使用できませんあなたのfinallyブロックのメソッドがキャッチされていない例外をスローすると、それ以降は何も実行されません(つまり、例外は他のコードと同様にスローされます)。これが起こる非常に一般的なケースはjava.sql.Connection.close()です。

私は、使用したコードサンプルが単なる例であると推測していますが、finallyブロックの中に実際のロジックを置くことに注意してください。 finallyブロックは、リソースのクリーンアップ(DB接続のクローズ、ファイルハンドルの解放など)を目的としており、必須のロジックではありません。 try-catchブロックの前で実行しなければならない場合は、例外をスローする可能性のあるものから離れてください。あなたの意図はほぼ確実に機能的に同じです。

+4

徹底的なリストのために+1 –

+4

「try-catch-finallyブロックを実行しているスレッドは中断されています」とはどういう意味ですか?恐らく、そのドキュメントの言葉はあまり言いませんが、Thread.interrupt()はtryブロックかcatchブロックかにかかわらずfinallyブロックをスキップしません。これはThread.stop()のように、より暴力的なものを意味するために「中断」されていますか? –

+0

@ジョー:そうですね、ここの文書は多少の言葉で言い表されていないと思います。スレッドの活動の一般的な中断を意味します。 – GaryF

9

はい。

documentationを参照してください:tryブロックの終了を とき

ついに常にををブロックが実行されます。

例外:

注: やキャッチコードを試しながら、JVMが終了した場合はfinallyブロックが実行されない可能性 、その後、実行されています。 同様に、 を実行しようとしているスレッドが中断された場合、または が終了した場合、 というアプリケーションが続行されても、finallyブロックは実行されない可能性があります( )。

1

はい。 finallyブロックは、Java VMを停止するためSystem.exit()を呼び出す場合を除いて常に実行されます。

+0

シャットダウンフックはSystem.exit()の後でも呼び出されますが、既存の非システムスレッドはすべて停止しています。 –

0

が最後に常に実行され、関係なく、あなたの場合は

  • のtry-catch-finallyブロック
  • は未チェック例外Java用

をすなわちスローされたものを、エラー処理を強制しません。 これが理由で、finallyブロックでチェックされていない例外が発生し、それに対する処理が行われなかった場合、このポイント(エラーが発生した場所)の下に書き込まれたコードは実行されません。

だから、すべての例外を常に処理することをお勧めします。 このようにして、チェックされていない例外が発生した場合でも、最終的にコードブロックが実行されるようにすることができます。あなたはサブネストの場所にキャッチし、最終的にあなたの必要な作業を完了するためにブロックします。

関連する問題