導入
組み込みの例外(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を継承すると、それは「例外クラス」としてthrow・catchできるようになります。throws InsufficientFundsException… メソッド宣言に書くと、「このメソッドはこの例外を投げる可能性がある」ことを呼び出し側に伝えます。- この学習用シミュレータでは、自作の例外クラスに
messageという名前のフィールドを持たせてコンストラクタで設定すると、getMessage()で自動的にその値を取り出せます。
やってみよう
下のエディタで withdraw に渡す金額を変えて実行し、残高が足りているときは例外が投げられず 出金しました と表示されることを確認しましょう。
演習
class InvalidAgeException extends Exception を作り、String message フィールドとコンストラクタ(this.message = msg;)を用意してください。static void register(int age) throws InvalidAgeException を作り、age が 0 未満か 120 より大きければ "年齢が不正です" というメッセージで InvalidAgeException を throw し、そうでなければ "登録しました" と表示してください。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()); }。