例外修羅道 Step05:finallyで「終わらせる力」を持て

0004_例外修羅道-step05 learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(Step05)


問題のポイント

  • trycatch で何が起きても、必ず実行される処理を定義する、それが 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.
// 最後まで書け。それがコードに責任を持つってことや。

例外修羅道:全体のステップ構成はこちら