コース一覧
    Java中級:例外処理とファイル入出力
    finally ブロック

    Java中級:例外処理とファイル入出力

    例外処理とファイル入出力を学び、失敗に対応しながらデータを読み書きするプログラムを作れるようにします。

    1
    例外処理
    01. try-catch で例外をつかむ5分
    02. 複数の catch ブロック5分
    03. throws と例外の伝播5分
    04. 独自の例外を作る5分
    05. try-with-resources5分
    06. finally ブロック5分
    07. 例外処理 まとめクイズ5分
    2
    ファイル I/O
    01. Files でファイルに書き込む5分
    02. ファイルを行単位で読む5分
    03. Path でファイルパスを扱う5分
    04. BufferedReader と Stream API5分
    05. ファイルの存在確認と削除5分
    06. ファイル I/O まとめクイズ5分

    finally ブロック

    いちばん記録が欲しい回だけ、ログが残らない

    夜間バッチの取り込み処理に、開始と終了のログを入れました。

    Java

    System.out.println("取り込み開始");
    importRows(path);
    System.out.println("取り込み終了");

    翌朝ログを見ると、開始だけが記録されて終了が無い日があります。importRows の途中で例外が飛び、その先の行が実行されなかったのです。処理が成功した日はきれいに 2 行そろい、失敗した日だけ片方しか残りません。原因を追いたいのは失敗した日のほうなのに、手がかりがいちばん少なくなるわけです。

    catch に同じ行を書き足せば直りますが、catch が 2 つ 3 つと増えれば、そのすべてに同じ行をコピーすることになります。書き忘れた 1 つが、また同じ穴を開けます。

    finally は、どの道を通っても必ず寄る

    try には catch のほかに finally を付けられます。ここに書いた処理は、try を最後まで走り抜けたときも、catch に飛んだときも、必ず実行されてからメソッドの外に出ます。

    Java

    long start = System.currentTimeMillis();
    try {
        importRows(path);
        System.out.println("取り込み成功");
    } catch (RuntimeException e) {
        System.out.println("取り込み失敗 " + e.getMessage());
    } finally {
        System.out.println("所要 " + (System.currentTimeMillis() - start) + " ミリ秒");
    }

    成功でも失敗でも、所要時間が必ず 1 行残ります。分かれた道が最後に合流する場所、と考えると位置付けがはっきりします。

    強いのは、try の中に return があっても通ることです。Java は返す値をいったん控えてから finally を実行し、そのあとで呼び出し元に返します。誰も catch していない例外で抜けていく場合も同じで、finally を通ってから外へ飛んでいきます。

    ロックの解放、トランザクションの巻き戻し、実行回数の記録など、close() 一発では済まない後始末はここに置きます。ファイルや接続を閉じるだけなら、try-with-resources のほうが短く書けます。

    finally に return を書くと、例外が消える

    便利な場所なので、つい戻り値まで置きたくなります。これが最大の落とし穴です。

    Java

    public static int broken() {
        try {
            throw new IllegalStateException("本当の原因");
        } finally {
            return -1;
        }
    }

    呼び出し元に届くのは -1 だけです。IllegalStateException はどこにも現れません。finally の return が、飛んでいくはずだった例外を押し流してしまうからです。try の中に return があった場合も同じように上書きされます。

    同じ理由で、finally の中で新しい例外を投げるのも避けてください。元の例外が上書きされて、本当の原因が消えます。どうしても例外になり得る処理を置くなら、その部分だけ try-catch で包んでログに残しておきます。

    finally には後始末だけを書き、return は外に 1 つだけ置く。これを守るだけで、この手のバグはほぼ起きません。

    要件

    1. try ブロックの中で a / b を計算し、正常時は "result=" + 商 の文字列を組み立てること
    2. ArithmeticException を catch して、例外時は "error" の文字列を組み立てること
    3. finally ブロック (または finally と同等の最終処理) を用いて、正常時・例外時のいずれでも戻り値の末尾に必ず ",end" を付け加えること

    ヒント

    `String message;` のように、`try` `catch` の両方から代入できる変数を `try` の外側で宣言しておくと整理しやすいです

    整数の商と文字列を連結したいときは `"result=" + (a / b)` のように、`int` をそのまま `+` でくっつければ自動で文字列化されます

    `finally` 内で `return` してしまうと例外を握りつぶす落とし穴になるので、`return` は `finally` の外に 1 行だけ書きましょう

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • 例外処理 まとめクイズ

      例外処理 (try-catch / 複数 catch / throws / カスタム例外 / try-with-resources / finally) の総まとめ。検査例外と非検査例外、catch の順序、finally で return など実務頻出のポイントを 4 択クイズで確認する。

    • Files でファイルに書き込む

      Java の標準ライブラリ `java.nio.file.Files` を使って、ファイルへの書き込みと読み込みをわずか数行で実現する方法を学ぼう。

    • try-with-resources

      AutoCloseable なリソースを安全に扱う try-with-resources 構文を学び、リソースの自動クローズを体験しよう。

    • 独自の例外を作る

      Java の例外クラスを継承して独自の `InsufficientFundsException` を作り、銀行口座の出金処理で `throw` / `catch` する流れを学んでみよう。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 処理計算や代入を表す長方形
    • メソッドクラスに属する関数
    • ロック「他の人触らないでね」と DB に予約する
    • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
    • 戻り値呼び出し元への返答を表す点線矢印
    main.java
    エディタを読み込んでいます

    メモ

    finally ブロック

    ⌘S で保存