Javaのfinallyとは?例外が起きても必ず実行される処理

Schoo Java入門 初級 第9回 例外処理

本記事は、Schooの「Java入門 初級【2026年版】」第9回「例外処理」を学ぶ前後に、finally の役割を整理したい方向けの記事です。

finally は、try-catch のあとに書く「最後に実行したい処理」の場所です。例外が起きたかどうかに関係なく、後処理を通したいときに使います。

まずは難しく考えず、「開いたものを閉じる」「使ったものを片付ける」「最後に必ず表示したい処理を書く」場所として押さえましょう。

Schoo コースページ:Java入門 初級【2026年版】

finallyは何のために使うのか

try-catch だけでも、例外が起きたときの対応は書けます。ただし、処理の途中で例外が起きると、本来最後に実行したかった片付け処理を通れないことがあります。

そこで使うのが finally です。finally に書いた処理は、try が正常に終わった場合でも、catch に移った場合でも、最後に実行されます。

図解:finallyは最後に通る後処理
例外が起きない場合
tryの処理を実行
finallyの後処理
次の処理へ進む
例外が起きた場合
tryで例外が起きる
catchで対応する
finallyの後処理
次の処理へ進む
finally は、正常に進んだ場合も、例外を catch した場合も、最後に実行される場所です。

finallyの基本形

finally は、try-catch の後ろに続けて書きます。

try {
    例外が起きるかもしれない処理
} catch (Exception e) {
    例外が起きたときの処理
} finally {
    最後に必ず実行したい処理
}

try には、例外が起きるかもしれない処理を書きます。catch には、例外が起きたときの対応を書きます。finally には、最後に実行したい後処理を書きます。

例外が起きない場合もfinallyは実行される

次のコードでは、10 / 2 は正常に計算できます。この場合、catch は実行されませんが、finally は実行されます。

try {
    int result = 10 / 2;
    System.out.println("結果:" + result);
} catch (ArithmeticException e) {
    System.out.println("0で割ることはできません");
} finally {
    System.out.println("計算処理を終了します");
}

表示の流れは、結果:5 のあとに 計算処理を終了します です。例外が起きなくても、最後の後処理として finally が通ります。

例外が起きた場合もfinallyは実行される

次のコードでは、10 / 0 で例外が発生します。この場合は catch に移りますが、そのあと finally も実行されます。

try {
    int result = 10 / 0;
    System.out.println("結果:" + result);
} catch (ArithmeticException e) {
    System.out.println("0で割ることはできません");
} finally {
    System.out.println("計算処理を終了します");
}

この場合、結果: の行は実行されません。代わりに catch の中でエラーメッセージを表示し、その後に finally の処理が実行されます。

図解:開いたものを最後に閉じる
try {
    ファイルを開く
    ファイルを読む
} catch (Exception e) {
    エラーを表示する
} finally {
    ファイルを閉じる
}
try
使いたいものを開いて処理する
catch
問題が起きたときだけ対応する
finally
最後に片付ける処理を置く
ファイルや接続のように、使い終わったら閉じたいものがあるとき、finally の役割をイメージしやすくなります。

finallyに書く処理の例

finally には、処理が成功しても失敗しても最後に行いたいことを書きます。

  • ファイルを閉じる
  • データベースや外部サービスとの接続を閉じる
  • 処理終了のメッセージを表示する
  • 一時的に使った状態を元に戻す

最近のJavaでは、ファイルや接続の後処理には try-with-resources という書き方もよく使われます。ただ、finally の考え方を理解しておくと、「例外が起きても後処理が必要になる」場面を読み取りやすくなります。

returnがあってもfinallyは通る

少し進んだ話ですが、trycatch の中に return がある場合でも、メソッドを抜ける前に finally が実行されます。

try {
    return 100;
} finally {
    System.out.println("最後に実行します");
}

この例では、100 を返して終わる前に、finally の中の表示処理が実行されます。最初のうちは、「メソッドを抜ける直前にも finally は通る」と覚えておけば十分です。

確認問題

  1. finally には、どのような処理を書きますか。
  2. try の中で例外が起きなかった場合、finally は実行されますか。
  3. catch の中で例外に対応したあと、finally は実行されますか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

finally は、例外が起きた場合も起きなかった場合も、最後に実行したい処理を書く場所です。ファイルを閉じる、接続を閉じる、処理終了のメッセージを出すなど、後処理をまとめるときに使います。trycatchfinally の流れを分けて考えると、例外処理の読み方が整理しやすくなります。

info

シェアする