1. ホーム
  2. java

[解決済み] 新しいExceptionを投げても、finally blockは実行されるのでしょうか?

2022-04-24 08:28:39

質問

このコードでは someVar キャッチブロックが実行され、2つ目の例外が発生した場合でも、設定されるのでしょうか?

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

どのように解決するのですか?

そう、finallyブロックは常に実行される...時を除いて。

  • try-catch-finallyブロックを実行しているスレッドがkillされるか、割り込まれる。
  • を使用します。 System.exit(0);
  • 基盤となるVMが他の方法で破壊される
  • 基盤となるハードウェアが何らかの理由で使用不能になった

さらに、finallyブロック内のメソッドがキャッチできない例外をスローした場合、それ以降は何も実行されません(つまり、他のコードと同じように例外がスローされます)。このようなことが起こるのは、非常によくあるケースです。 java.sql.Connection.close() .

余談ですが、今回のコードサンプルは単なる例だと思われますが、finallyブロックの中に実際のロジックを入れるのは注意が必要です。finallyブロックはリソースの後始末(DB接続の終了、ファイルハンドルの解放など)のためのものであり、必ず実行しなければならないロジックのためのものではありません。もし実行しなければならないのであれば、try-catchブロックの前で、例外を投げる可能性のあるものから遠ざけてください。