新しい例外をスローした場合でも、finally ブロックは実行されますか? 質問する

新しい例外をスローした場合でも、finally ブロックは実行されますか? 質問する

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

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

ベストアンサー1

はい、finally ブロックは常に実行されます...ただし、次の場合は除きます:

  • try-catch-finallyブロックを実行しているスレッドが強制終了または中断される
  • あなたが使うSystem.exit(0);
  • 基盤となるVMが何らかの方法で破壊される
  • 基盤となるハードウェアが何らかの理由で使用できない

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

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

おすすめ記事