本文へスキップ
BecomeCoder

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

finally と throw ― 自分で例外を投げる

ブラウザで完結

導入

「エラーが起きても起きなくても、必ず実行したい後片付けの処理」があります。それが 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) メソッドを作り、stock0 以下なら 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("処理終了"); }

実際に動かしてみよう

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

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

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