【Java】throwについて
このページでは、Javaの例外処理で使用されるthrowについて詳しく解説します。例とともに基本的な使い方から応用的な使用方法までを説明します。
throwとは
throwは、Javaで例外を明示的に発生させるために使用されるキーワードです。例外がスローされると、通常のプログラムの流れが中断され、例外をキャッチするコードに制御が移ります。
例外は、Throwableクラスのインスタンスまたはそのサブクラス(例:ExceptionやError)として表現されます。
基本的な使い方
例外をスローする基本的な方法は次の通りです。
public class Main {
public static void main(String[] args) {
try {
throw new IllegalArgumentException("Invalid argument provided");
} catch (IllegalArgumentException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
このコードでは、throwを使ってIllegalArgumentExceptionをスローし、それをcatchブロックで捕捉しています。
throwsとの違い
throwとthrowsは似た名前ですが、意味が異なります。
throw: 実際に例外をスローします。throws: メソッドシグネチャで例外がスローされる可能性があることを宣言します。
例:
public class Main {
public static void main(String[] args) throws Exception {
throwException();
}
public static void throwException() throws Exception {
throw new Exception("An exception occurred");
}
}
この例では、throwsを使用してthrowExceptionメソッドが例外をスローすることを宣言しています。
カスタム例外を投げる
独自の例外クラスを作成して、それをスローすることも可能です。カスタム例外を使うことで、特定の状況に応じたエラーを表現できます。
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public class Main {
public static void main(String[] args) {
try {
validateAge(15);
} catch (CustomException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
public static void validateAge(int age) throws CustomException {
if (age < 18) {
throw new CustomException("Age must be 18 or older");
}
}
}
この例では、CustomExceptionクラスを作成し、validateAgeメソッド内でスローしています。
例外の再スロー
例外をキャッチした後で再スローすることもできます。これにより、例外をさらに上位の呼び出し元で処理させることが可能になります。
public class Main {
public static void main(String[] args) {
try {
process();
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
public static void process() throws Exception {
try {
throw new Exception("Original exception");
} catch (Exception e) {
System.out.println("Re-throwing exception");
throw e; // 再スロー
}
}
}
この例では、例外をキャッチした後に再スローしています。
throw使用時の一般的なエラー
- 例外の型が不適切: スローされるオブジェクトは
Throwableのサブクラスでなければなりません。 - 未処理のチェック例外: チェック例外をスローする場合、
throwsで明示的に宣言する必要があります。 - 例外の再スロー時の情報損失: 再スローする場合、元のスタックトレースを保持するよう注意が必要です。
例:
public class Main {
public static void main(String[] args) {
try {
throw new String("This is not allowed"); // コンパイルエラー
} catch (Exception e) {
System.out.println("Caught exception");
}
}
}
この例では、Throwableを継承していないStringオブジェクトをスローしようとしているため、コンパイルエラーが発生します。