導入
「エラーが起きても起きなくても、必ず実行したい後片付けの処理」があります。それが finally です。加えて、自分のプログラムの都合で意図的にエラーを発生させたいときは throw を使います。
説明
public class Main {
public static void main(String[] args) {
try {
check(-5);
} catch (IllegalArgumentException e) {
System.out.println("エラー: " + e.getMessage());
} finally {
System.out.println("チェック終了");
}
}
static void check(int age) {
if (age < 0) {
throw new IllegalArgumentException("年齢は0以上にしてください");
}
System.out.println("OK: " + age);
}
}
throw new IllegalArgumentException("...")… 「不正な引数です」という意味の組み込み例外を、メッセージ付きで自分から発生させます。throwされると、そこから先の処理は実行されず、対応するcatchまで一気に処理が飛びます。finally { ... }…tryの中でエラーが起きても起きなくても、必ず最後に実行される ブロックです。「ファイルを閉じる」「後片付けをする」といった処理を書く場所です。e.getMessage()… 例外が持っているメッセージ(throwしたときに渡した文字列)を取り出します。
やってみよう
下のエディタで check(-5) を check(20)(正常な値)に変えて実行し、catch は実行されないが finally は必ず実行されることを確認しましょう。
演習
static void checkStock(int stock) メソッドを作り、stock が 0 以下なら IllegalStateException を "在庫がありません" というメッセージ付きで throw してください。それ以外なら "購入できます" と表示してください。main から checkStock(0) を呼び、try-catch-finally で例外メッセージを エラー: メッセージ の形で表示し、finally で 処理終了 と表示してください。
ヒント1を見る
static void checkStock(int stock) { if (stock <= 0) { throw new IllegalStateException("在庫がありません"); } System.out.println("購入できます"); }。
ヒント2を見る
try { checkStock(0); } catch (IllegalStateException e) { System.out.println("エラー: " + e.getMessage()); } finally { System.out.println("処理終了"); }。