例外修羅道 Step07:throwで「その場で起こせ」

0004_例外修羅道-step07 learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(Step07)


問題のポイント

  • throw は、「今この場で例外を起こす」文法。
  • throws が「将来的に投げるかも」と宣言するのに対し、
    throw「今すぐこれを投げる」 という、明確な実行命令や。
  • 不正な入力や状態を、自ら明示的に「エラーだ」と判断できるコードを書け。

まず、日本語で考えろ

年齢がマイナス?
──そんなもん、値として受け入れたらアカン。
じゃあどうする?
「ここは明らかにおかしいから、自分で例外を投げる」
その設計を、throw new IllegalArgumentException(...) で書くんや。


コメントを書け

// 年齢をチェックし、不正な場合は例外をthrowする
// 0未満なら IllegalArgumentException を明示的に投げる
// 正常なら年齢をそのまま出力する

コメントに従ってコードを書け

public class ExceptionUtil {

    public static void checkAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("年齢は0以上でなければなりません");
        }
        System.out.println("年齢: " + age);
    }
}
public class Main {
    public static void main(String[] args) {
        try {
            ExceptionUtil.checkAge(25);  // 正常
            ExceptionUtil.checkAge(-5);  // 例外発生
        } catch (IllegalArgumentException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

実行結果の例

年齢: 25  
エラー: 年齢は0以上でなければなりません

コードの解説

  • if (age < 0) という明確な条件で、不正な状態を検出
  • その場で throw new IllegalArgumentException(...) を実行し、強制的に処理を中断
  • 呼び出し側は try-catch を使ってそれを受け止める設計にしている
  • IllegalArgumentException は、「引数が不正」なときに使う標準的な例外クラス

つまづきやすいポイント

  • throw を書いたら、その後ろに続く処理は実行されない(returnより強制的)
  • IllegalArgumentExceptionRuntimeException の子なので、throws 宣言は不要
  • throw は「例外を作って投げる」。new を忘れるとコンパイルエラーになる

// tesh:
// 「チェックして弾く」ってのは、入力フォームのバリデーションだけの話やない。
// プログラムのどこでも、“おかしいと思ったら止める”構造を持て。
// 
// それを可能にするのが throw や。
// コードに「常識」を埋め込め。不正は、その場で斬れ。
// 
// Just keep typing, baby.
// おかしいと思ったら黙るな。投げろ。構造で拒め。

例外修羅道:全体のステップ構成はこちら