本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第7章 例外・enum・record ― エラーと向き合い、データを簡潔に表す · レッスン28

自作例外 ― 独自のエラーを定義する

ブラウザで完結

導入

組み込みの例外(IllegalArgumentException など)だけでなく、自分のプログラム専用の意味のある例外を作ることもできます。「残高不足」「在庫切れ」のような、そのプログラムならではのエラーを表現できるようになります。

説明

Exception継承したクラスを作れば、自作の例外クラスになります。

public class Main {
    public static void main(String[] args) {
        try {
            withdraw(1000, 3000);
        } catch (InsufficientFundsException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }

    static void withdraw(int balance, int amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("残高不足です");
        }
        System.out.println("出金しました");
    }
}

class InsufficientFundsException extends Exception {
    String message;

    InsufficientFundsException(String msg) {
        this.message = msg;
    }
}
  • class InsufficientFundsException extends Exception { ... }Exception を継承すると、それは「例外クラス」として throwcatch できるようになります。
  • throws InsufficientFundsException … メソッド宣言に書くと、「このメソッドはこの例外を投げる可能性がある」ことを呼び出し側に伝えます。
  • この学習用シミュレータでは、自作の例外クラスに message という名前のフィールドを持たせてコンストラクタで設定すると、getMessage() で自動的にその値を取り出せます。

やってみよう

下のエディタで withdraw に渡す金額を変えて実行し、残高が足りているときは例外が投げられず 出金しました と表示されることを確認しましょう。

演習

class InvalidAgeException extends Exception を作り、String message フィールドとコンストラクタ(this.message = msg;)を用意してください。static void register(int age) throws InvalidAgeException を作り、age0 未満か 120 より大きければ "年齢が不正です" というメッセージで InvalidAgeExceptionthrow し、そうでなければ "登録しました" と表示してください。main から register(200) を呼び、try-catchエラー: メッセージ の形で表示してください。

ヒント1を見る

class InvalidAgeException extends Exception { String message; InvalidAgeException(String msg) { this.message = msg; } }

ヒント2を見る

if (age < 0 || age > 120) { throw new InvalidAgeException("年齢が不正です"); } としてから try { register(200); } catch (InvalidAgeException e) { System.out.println("エラー: " + e.getMessage()); }

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。