✍️ 独自の例外クラスの作成

標準で提供されている例外クラス(IOExceptionNullPointerExceptionなど)だけでは対応できない、アプリケーション特有の異常事態を表現するために、開発者は独自の例外クラスを作成します。

1. 例外クラスの基本構造

独自の例外クラスを作成する最も簡単な方法は、Java標準の例外クラスを継承することです。

  1. 名前: クラス名の末尾に「Exception」を付けるのが慣習です(例: InvalidInputException)。
  2. 継承: **ExceptionまたはRuntimeException**のいずれかを継承します。
継承元作成される例外の種類処理の義務
Exception検査例外 (Checked Exception)呼び出し元で try-catch または throws必須
RuntimeException非検査例外 (Unchecked Exception)処理は任意。コンパイルエラーにはならない。

Google スプレッドシートにエクスポート

2. コード例: 検査例外の作成

ここでは、ユーザーが入力した年齢が不正な値だった場合に発生させる検査例外を作成します。

Java

// 継承元を Exception にすることで、検査例外となる
public class AgeValidationException extends Exception {
    
    // 慣習として、メッセージを受け取るコンストラクタを定義する
    public AgeValidationException(String message) {
        // 親クラス(Exception)のコンストラクタを呼び出し、エラーメッセージを渡す
        super(message);
    }
    
    // 例外の原因となった別の例外を一緒に保持する場合のコンストラクタ
    public AgeValidationException(String message, Throwable cause) {
        super(message, cause);
    }
}

🚀 3. 自作した例外の「スロー」と「キャッチ」

作成した例外は、throwキーワードを使って意図的に発生させることができます。

スロー (Throw)

例外が発生した条件が満たされたときに、throw newで例外オブジェクトを生成し、処理を中断します。

Java

public class UserService {
    // 検査例外を投げるため、throws AgeValidationException を宣言
    public void setAge(int age) throws AgeValidationException {
        if (age < 0 || age > 150) {
            // 独自の例外を発生させる
            throw new AgeValidationException("年齢の値(" + age + ")は無効です。0から150の範囲で入力してください。");
        }
        System.out.println("年齢を " + age + " に設定しました。");
    }
}

キャッチ (Catch)

setAgeメソッドは検査例外をthrowsしているため、このメソッドを呼び出す側は、必ずtry-catchで処理する必要があります。

Java

public class Main {
    public static void main(String[] args) {
        UserService service = new UserService();
        
        try {
            service.setAge(180); // 独自の例外が発生する処理
        } catch (AgeValidationException e) {
            // 独自の例外を捕捉し、ユーザーに分かりやすいメッセージを出力
            System.err.println("バリデーションエラー: " + e.getMessage());
        }
    }
}
// 出力: バリデーションエラー: 年齢の値(180)は無効です。0から150の範囲で入力してください。

このように独自の例外クラスを作成することで、プログラムの異常状態を詳細に定義し、エラー処理のコードを整理することができます。