Javaのfinallyブロックとは?初心者でもわかる必ず実行される処理の使い方
生徒
「Javaのtry-catch文を勉強してたんですが、finallyってなんですか?」
先生
「finallyブロックは、例外が起きても起きなくても必ず実行される処理を書く場所なんです。」
生徒
「必ず実行されるって、どんなときに使うんですか?」
先生
「ファイルやデータベースの接続を閉じるなど、後始末の処理を書くときにとても便利ですよ。それでは詳しく見ていきましょう。」
1. Javaのfinallyブロックとは?
Javaのfinallyブロックは、tryブロックとcatchブロックに続けて書かれる部分で、例外の発生に関係なく必ず実行される処理を記述します。たとえtry内でreturnが使われても、finallyの中の処理は実行されます。
Javaで例外処理を学ぶうえで、finallyは非常に重要なキーワードです。後片付けやリソースの解放など、必ず行いたい処理を安心して記述できるのが最大の利点です。
2. finallyブロックの基本的な書き方
Javaのfinallyブロックの基本構文は以下の通りです。catchを省略してtry-finallyとすることもできます。
public class FinallyBasicExample {
public static void main(String[] args) {
try {
System.out.println("処理を開始します。");
} finally {
System.out.println("必ず実行される処理です。");
}
}
}
処理を開始します。
必ず実行される処理です。
このように、tryブロック内で例外が発生しなくても、finallyの中の処理は確実に実行されます。
3. 例外が発生した場合でもfinallyは実行される
例外が発生した場合でも、finallyブロックは必ず実行されます。次のコードを見てください。
public class FinallyWithException {
public static void main(String[] args) {
try {
int result = 10 / 0;
System.out.println("結果:" + result);
} catch (ArithmeticException e) {
System.out.println("0で割ることはできません。");
} finally {
System.out.println("後始末の処理を実行します。");
}
}
}
0で割ることはできません。
後始末の処理を実行します。
このように、catchブロックで例外を処理しても、finallyは必ず実行され、ログ出力やリソース解放の場面で活躍します。
Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。
スッキリわかるJava入門 第4版をAmazonで見る※ Amazonアソシエイト・プログラムを利用しています
4. tryブロックでreturnしてもfinallyは実行される
Javaでは、tryブロックの中でreturnを使っても、finallyブロックの処理は実行されます。これも初心者が混乱しやすいポイントです。
public class FinallyWithReturn {
public static int testMethod() {
try {
System.out.println("tryブロックの中");
return 1;
} finally {
System.out.println("finallyブロックの中");
}
}
public static void main(String[] args) {
int result = testMethod();
System.out.println("戻り値: " + result);
}
}
tryブロックの中
finallyブロックの中
戻り値: 1
このように、returnの後でも、finallyは必ず実行されるため、「どうしても実行したい処理」は安心してここに書くことができます。
5. finallyブロックの主な用途と活用シーン
finallyブロックは、以下のような場面で使われます。
- ファイルやネットワークリソースのクローズ処理
- データベース接続の切断
- ロックの解放や一時ファイルの削除
- エラーログの出力や記録
たとえばファイル読み書きの後にファイルを閉じる処理をfinallyで書くことで、例外が発生してもリソースを適切に解放できます。
6. try-with-resourcesとの違いと併用
Java 7以降では、try-with-resources構文を使うと、finallyブロックを使わずに自動的にリソースを閉じることができます。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("sample.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("ファイル読み込み中にエラーが発生しました。");
}
}
}
この構文は、AutoCloseableインターフェースを実装しているクラスに使えます。try-with-resourcesはfinallyと同じくリソース解放に使えるため、より簡潔なコードが書けるメリットがあります。
7. finallyブロックで例外を再発生させるときの注意点
Javaでは、finallyブロック内で新たに例外をスローすると、元の例外が上書きされてしまうことがあります。これは初心者が見落としがちな落とし穴です。
例えば、tryで例外が発生したにも関わらず、finallyで別の例外がスローされると、最初の例外が消えてしまいます。
このような場合は、finallyで新たな例外を投げる前に、ログ出力やエラー情報の保持などを行い、デバッグ可能な形で残しておくことが推奨されます。