提示した2つのスニペットには大きな違いがあります。たとえば、catchブロック自体が例外をスローした場合finallyでも、ブロックはそのセマンティクスによって実行されます。
これは次のスニペットの印刷ですが、そうではあり"Finally!"ません"What about me???":
try {
throw null; // throws NullPointerException!
} catch (Exception e) {
int oops = 1/0; // throws ArithmeticException!
} finally {
System.out.println("Finally!"); // still gets executed!
}
System.out.println("What about me???"); // doesn't get executed!
一般的に言えば、ブロックのfinallyはtry実際には常に実行されます。tryブロックに続くコードには、そのような保証はありません。
しかし、私のcatchブロックが単なるprintステートメントである場合はどうなりますか?
それが何かをしないという保証はまだありませんthrow。例外の詳細メッセージの作成など、まだ問題が発生する可能性があります。
catchコードが「安全」であり、ステートメントに続くコードが常に実行されることを保証するために最善を尽くしてもtry、質問は「なぜ?」になります。なぜ回避するfinallyのに、そのセマンティクスを複製するために一生懸命努力するのですか?
finallyセマンティクスは保証されており、コードの作成者または作成者からの立証責任は必要ありません。このため、ブロックを使用して必須の「クリーンアップ」コードを配置するのは慣用的です。finallyを使用finallyすると、正確性が保証され、書き込み可能性と可読性の両方が向上します。