まずは問題を見ろ
→ 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より強制的)IllegalArgumentException
はRuntimeException
の子なので、throws
宣言は不要throw
は「例外を作って投げる」。new
を忘れるとコンパイルエラーになる
// tesh:
// 「チェックして弾く」ってのは、入力フォームのバリデーションだけの話やない。
// プログラムのどこでも、“おかしいと思ったら止める”構造を持て。
//
// それを可能にするのが throw や。
// コードに「常識」を埋め込め。不正は、その場で斬れ。
//
// Just keep typing, baby.
// おかしいと思ったら黙るな。投げろ。構造で拒め。