まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step05)
問題のポイント
try
やcatch
で何が起きても、必ず実行される処理を定義する、それがfinally
。- エラーがあってもなくても、**「最後にやるべきこと」**ってのは、たしかに存在する。
- リソースの解放やログの記録など、「やり残し」を防ぐ構造を体に叩き込め。
まず、日本語で考えろ
たとえば、ファイルを開いたあとでエラーが起きたら、どうする?
「ファイル閉じ忘れました」じゃ済まんよな?
そういうとき、エラーが起きても“最後にやる処理”を仕込むのが finally や。
コメントを書け
// 割り算の結果を出力する。ただしゼロ除算が起きる可能性がある
// エラーが起きたらエラーメッセージを出力
// エラーの有無にかかわらず、終了処理のメッセージを出力する
コメントに従ってコードを書け
public class ExceptionUtil {
public static void computeAndCleanup(int a, int b) {
try {
int result = a / b;
System.out.println("計算結果: " + result);
} catch (ArithmeticException e) {
System.out.println("エラー: ゼロによる除算です");
} finally {
System.out.println("終了処理を実行しました");
}
}
}
実行結果の例
computeAndCleanup(20, 5); → 計算結果: 4 / 終了処理を実行しました
computeAndCleanup(10, 0); → エラー: ゼロによる除算です / 終了処理を実行しました
コードの解説
finally
ブロックは、tryの中で例外が起きようが起きまいが、必ず最後に実行される- 今回は
"終了処理を実行しました"
という出力で確認しているが、現場では以下のような処理に使われる:- ファイルを閉じる
- DB接続を切る
- ログを確実に記録する
つまづきやすいポイント
catch
を書かなくてもtry-finally
だけでも成立する(が、今回はcatch
も書く)finally
ブロックがあることで、リターンしてもその後に処理される点に注意System.exit()
のような強制終了を使うと、finally
は実行されない(例外ケース)
// tesh:
// プログラムってのは、「終わらせ方」が甘いとすぐボロが出る。
// 最後に何をやるかまで決めて初めて、構造は“完成”する。
//
// ミスってもいい。落ちてもいい。
// でも「後始末できるコード」を書けるようになったら、おまえは一歩プロに近づいてる。
//
// Just keep typing, baby.
// 最後まで書け。それがコードに責任を持つってことや。