Javaのカスタム例外を作成する方法を完全ガイド!初心者でもわかる独自例外クラスの作り方
生徒
「Javaで自分だけの例外クラスを作るにはどうすればいいんですか?」
先生
「JavaではExceptionクラスを継承して、自分だけのカスタム例外を作ることができますよ。」
生徒
「どんなときにカスタム例外を使えばいいんですか?」
先生
「ビジネスロジックに特化したエラーや、独自のエラーメッセージを使いたいときに便利です。では、詳しく見ていきましょう!」
1. Javaでカスタム例外とは?
Javaの例外処理において、カスタム例外(独自例外クラス)は自分で定義した例外を表現するための仕組みです。標準で提供されているIOExceptionやNullPointerExceptionなどでは表現しきれない、アプリケーション固有のエラーを扱いたいときに使います。
Javaのカスタム例外は、次のようにExceptionまたはRuntimeExceptionを継承して作成します。
2. カスタム例外を作成する基本の書き方
まずは、Javaでのカスタム例外の基本的な作成方法を見てみましょう。今回は「年齢が不正なときに発生する例外」を作ってみます。
public class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
このように、Exceptionを継承して、コンストラクタでエラーメッセージを親クラスに渡すだけでOKです。
3. カスタム例外の使い方を実践で学ぼう
次は、カスタム例外を実際に使う例を見ていきましょう。ユーザーの年齢をチェックして、未成年だった場合に例外を投げる処理を作ってみます。
public class UserValidator {
public static void checkAge(int age) throws InvalidAgeException {
if (age < 18) {
throw new InvalidAgeException("18歳未満のユーザーは登録できません。");
}
}
public static void main(String[] args) {
try {
checkAge(16);
} catch (InvalidAgeException e) {
System.out.println("エラー: " + e.getMessage());
}
}
}
エラー: 18歳未満のユーザーは登録できません。
このように、throw newで例外を発生させ、catchで適切に処理することで、プログラムの流れを制御できます。
4. カスタム例外はいつ使う?
Javaのカスタム例外は以下のような場面で非常に役立ちます。
- ビジネスルールに特化したエラー(例:在庫切れ、ユーザー権限エラー)
- 複数の箇所で同じ種類の例外を扱いたいとき
- より読みやすく、メンテナンスしやすいコードを書くとき
例えばECサイトで「商品が見つからない」ときにProductNotFoundExceptionを使うと、コードが明確になります。
5. チェック例外と非チェック例外の違い
Javaの例外には「チェック例外(Exceptionの直接継承)」と「非チェック例外(RuntimeExceptionの継承)」があります。
違いは以下のとおりです:
- チェック例外:呼び出し元で
throws宣言またはtry-catchが必須。 - 非チェック例外:明示的な処理が不要。実行時に発生。
以下はRuntimeExceptionを継承した非チェック例外の例です。
public class CustomRuntimeException extends RuntimeException {
public CustomRuntimeException(String message) {
super(message);
}
}
非チェック例外は、コードが簡潔になる反面、例外処理の見落としに注意が必要です。
6. 複数のカスタム例外を使い分けるテクニック
現実の開発では、複数の独自例外を使い分けることで、より明確なエラー処理が可能になります。
例えば以下のようなクラスを用意します:
public class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
public class PasswordMismatchException extends Exception {
public PasswordMismatchException(String message) {
super(message);
}
}
これにより、ユーザー認証において「ユーザーが存在しない」のか「パスワードが間違っている」のかを明確に分けて処理できます。
7. カスタム例外に追加情報を持たせるには?
独自例外クラスには、エラーメッセージ以外の情報(例:エラーコード、原因となる値など)も追加できます。
public class ApiException extends Exception {
private int errorCode;
public ApiException(String message, int errorCode) {
super(message);
this.errorCode = errorCode;
}
public int getErrorCode() {
return errorCode;
}
}
このように、詳細なエラー管理が可能になるので、大規模なシステムやAPI連携では特に便利です。