Javaで例外を再スローする方法をわかりやすく解説
Javaプログラミングでは、catchブロックで捕捉した例外を再度スロー(再スロー)する必要がある場面に出会うことがあります。たとえば、catchブロック側ではその例外を適切に処理できず、より上位の呼び出し元に処理を委ねたい場合などです。
再スローを行うと、最初にスローされた例外オブジェクトがそのまま投げ直されます。ここで重要なのは、再スロー式が実行される時点で、その例外はすでに現在のスコープで捕捉済みであるという点です。そのため、再スローされた例外は現在のスコープ内のcatchブロックでは処理されず、一つ外側のtryブロックへと伝播していきます。そして、その外側のtryブロックに対応するcatchブロックが、改めてこの例外を捕捉する機会を得ます。
基本構文
再スローの書き方は非常にシンプルです。catchブロックの中で、捕捉した例外変数をそのままthrowするだけです。
catch(Exception e) {
System.out.println("例外がスローされました");
throw e;
}コード例
以下のサンプルでは、test1()で発生した例外を、test2()のcatchブロックで一度捕捉してから再スローし、最終的にmain()メソッドで捕捉しています。
public class RethrowException {
public static void test1() throws Exception {
System.out.println("test1()メソッド内で例外が発生");
throw new Exception("test1()メソッドからスローされた例外");
}
public static void test2() throws Throwable {
try {
test1();
} catch(Exception e) {
System.out.println("test2()メソッドのcatchブロック内");
// 捕捉した例外をそのまま再スロー
throw e;
}
}
public static void main(String[] args) throws Throwable {
try {
test2();
} catch(Exception e) {
System.out.println("mainメソッドで例外を捕捉");
}
}
}実行結果
test1()メソッド内で例外が発生 test2()メソッドのcatchブロック内 mainメソッドで例外を捕捉
この実行結果から、例外がtest1() → test2() → main()の順に伝播し、途中のcatchブロックで一度捕捉された後も、再スローによって最終的に上位のcatchブロックまで届いていることが確認できます。
補足:再スロー時の注意点
- ログ出力との併用: 再スローの前にログを記録しておくと、例外の伝播経路や発生状況を後から追跡しやすくなります。
- 例外のラップ:
throw new RuntimeException(e)のように、元の例外を原因(cause)として新しい例外に包んでスローする手法もあります。これにより、抽象度の高い独自例外として扱えます。 - throws宣言: 検査例外を再スローする場合は、メソッドのシグネチャに適切な
throws宣言が必要です。
-
Windows 10・8・7でJavaをアンインストールする2つの方法【手動/ツール】
近年、Javaを日常的に利用するユーザーは少なくなりました。しかし、PCに残された古いバージョンのJavaは、システムにさまざまなセキュリティリスクをもたらすといわれています。一方で、NVIDIAグラフィックドライバーのインストールなど、一時的にJavaが必要になるケースもあります。 そのような用途が終わった後は、Windows 10からJavaを削除したいと考える方が多いのではないでしょうか。実際、多くのユーザーがWindowsやMacでJava 11やJava 8をアンインストールしたいと報告しています。どのバージョンを削除したい場合でも、以下の方法でJavaを完全かつ恒久的に取り除くこ
-
JavaでMySQLに接続する方法を解説!JDBC接続の基本コード
JavaとMySQLを接続するには? JavaアプリケーションからMySQLデータベースに接続するには、JDBC(Java Database Connectivity)を使用します。JDBCは、Javaからリレーショナルデータベースへアクセスするための標準APIであり、MySQL用のJDBCドライバ(Connector/J)をクラスパスに追加しておく必要があります。 以下は、Javaのコードを使ってMySQLに接続する基本的なサンプルです。 MySQL接続のサンプルコード import java.sql.Connection; import java.sql.DriverManager; p