Javaのfinallyブロックは常に実行される?実行されないケースを徹底解説
結論から言うと、finallyブロックは基本的に常に実行されます。ただし、JVM(Java仮想マシン)のクラッシュやSystem.exit()の呼び出しなどによるプログラムの異常終了が発生した場合は例外です。
finallyブロックの基本動作
- finallyブロックは、例外が発生したかどうかにかかわらず必ず実行されます。
- ファイルやデータベース接続のクローズ処理など、例外発生時の後始末(クリーンアップ)に利用されるのが一般的です。
- ただし、tryブロック内に
System.exit()のようなプログラムを強制終了させる記述がある場合、その時点でプログラムが終了するため、finallyブロックは実行されません。
finallyブロックが実行されない主なケース
以下のような特殊な状況では、finallyブロックは実行されないことがあります。
- JVMがメモリ不足(OutOfMemoryError)に陥った場合
- タスクマネージャーやコンソールからJavaプロセスが強制終了された場合
- 停電などによりマシン自体がシャットダウンした場合
- tryブロック内でデッドロックが発生した場合
サンプルコード1:通常のfinallyブロックの動作
public class FinallyBlock {
public static void main(String args[]){
try {
int a=10,b=30;
int c = b/a;
System.out.println(c);
} catch(ArithmeticException ae){
System.out.println(ae);
} finally {
System.out.println("finally block is always executed");
}
}
}この例では、例外が発生してもしなくても、finallyブロックが必ず実行されます。
実行結果
3 finally block is always executed
サンプルコード2:System.exit()を使用した場合
public class FinallyBlock {
public static void main(String args[]) {
try {
System.out.println("I am in try block");
System.exit(1);
} catch(Exception ex){
ex.printStackTrace();
} finally {
System.out.println("I am in finally block");
}
}
}この例では、tryブロック内のSystem.exit(1)によってプログラムが強制終了されるため、finallyブロックは実行されません。
実行結果
I am in try block
まとめ
finallyブロックは「ほぼ常に」実行されると覚えておけば問題ありませんが、System.exit()の呼び出しやJVMの異常終了といった例外的な状況では実行されない点に注意が必要です。リソースの解放処理などをfinallyブロックに記述する際は、この挙動を理解しておきましょう。
-
Javaで現在の作業ディレクトリ(カレントディレクトリ)を取得する方法
Javaで現在の作業ディレクトリ(カレントディレクトリ)を取得するにはどうすればよいのでしょうか。ここでいう「現在の作業ディレクトリ」とは、実行中のJavaプロジェクトのルートフォルダを指します。 Javaでは、Systemクラスが提供するシステムプロパティを利用することで、現在の作業ディレクトリを簡単に取得できます。使用するのは、以下のシステムプロパティ関数です。 String cwd = System.getProperty(user.dir); user.dirというキーを指定してSystem.getProperty()メソッドを呼び出すと、JVMが起動されたディレクトリ(作業ディレ
-
Javaで現在の日付・時刻を取得する3つの方法(LocalDate / LocalTime / LocalDateTime)
Javaで現在の日付や時刻を取得したいと思ったことはありませんか?このチュートリアルでは、Java 8以降で利用できる3つの異なる方法を、サンプルコードとともにわかりやすく解説します。 日付や時刻の表示に使用する主なクラスは、LocalDate、LocalTime、LocalDateTime の3つです。これらはすべて java.time パッケージに含まれており、従来の Date や Calendar クラスに比べて直感的で扱いやすいのが特徴です。 現在の日付を取得する LocalDate クラスは、タイムゾーン情報を持たない「日付」を表すために使用します。 GetCurrentDate.j