😊

「中学生でもわかるポケモンで完全理解!Javaの例外処理11選:ピカチュウがコードも出力もぜんぶ見せるからNullも配列ミスも怖くない」

に公開

💥Javaの例外処理をポケモンで学ぼう!

プログラムには、予想外のトラブルが起きることがあります。
Javaではそのような「問題が起きたとき」に、プログラムが止まらないように**例外処理(Exception Handling)**を使います。

今回は、ポケモンの世界と実生活を使って、楽しく学んでみましょう!

🔖 目次(逆引き付き)


🟡 例1:ピカチュウの技が出せない(ポケモンの例)

🎮 ポケモンの状況

サトシがピカチュウに「10まんボルト」を出させようとしたけど、PPがゼロで出せなかった!


💻 Javaコードで書くと…

public class PikachuBattle {
    public static void main(String[] args) {
        int pp = 0; // 技の残りPP(今回はゼロ)

        try {
            if (pp == 0) {
                throw new Exception("PPが足りません!");
            }

            System.out.println("ピカチュウの10まんボルト!こうかはばつぐんだ!");
        } catch (Exception e) {
            // エラーが出ても止まらず、代わりの行動をする
            System.out.println(e.getMessage());
            System.out.println("→ ピカチュウは代わりにたいあたりを使った!");
        }
    }
}

🖨 出力結果

PPが足りません!
→ ピカチュウは代わりにたいあたりを使った!

🏠 例2:財布にお金が入っていない(実生活の例)

🛒 状況

おにぎりを買おうとしたら、財布にお金がなかった!


💻 Javaコードで書くと…

public class BuyOnigiri {
    public static void main(String[] args) {
        int money = 0; // 財布に入っているお金(今回はゼロ)

        try {
            if (money < 150) {
                throw new Exception("お金が足りません!");
            }

            System.out.println("おにぎりを買いました!");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("→ 家にあるパンを食べることにしました。");
        }
    }
}

🖨 出力結果

お金が足りません!
→ 家にあるパンを食べることにしました。

✅ ここまでの例1-2ポイントまとめ

用語 内容
try 問題が起きるかもしれない処理を書く 技を出す/買い物する
throw 自分で「例外(エラー)」を起こす PPが0のときに「技が出せない」と言う
catch 問題が起きたときの対処方法を書く 代わりの技を出す/パンを食べる

🔴 例3:ポケモンがいない場所を見ようとした(ArrayIndexOutOfBoundsException)

🎮 ポケモンの状況

ポケモンボックスに3体しか入っていないのに、**5番目(インデックス4)**のポケモンを見ようとした!


💻 Javaコードで書くと…

public class PokemonBox {
    public static void main(String[] args) {
        String[] box = {"ピカチュウ", "ヒトカゲ", "ゼニガメ"};

        try {
            // 存在しない5番目のポケモン(index 4)を見ようとする
            System.out.println("5番目のポケモン: " + box[4]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("ボックスにそんなポケモンはいません!");
            System.out.println("→ 代わりに1番目のポケモンを見ます: " + box[0]);
        }
    }
}

🖨 出力結果

ボックスにそんなポケモンはいません!
→ 代わりに1番目のポケモンを見ます: ピカチュウ

🏠 実生活のたとえ:お弁当箱の4段目を探した(存在しない)

お弁当箱は3段しかないのに、4段目のふたを開けようとして怒られた!



⚫ 例4:使うはずのお皿が無かった(NullPointerException)

🎮 ポケモンの状況

バトル用の「どうぐ」を使おうとしたけど、**セットし忘れて空っぽ(null)**だった!


💻 Javaコードで書くと…

public class UseItem {
    public static void main(String[] args) {
        String item = null; // どうぐが何もセットされていない

        try {
            // nullなのに使おうとしてしまう
            System.out.println("使ったどうぐは:" + item.toUpperCase());
        } catch (NullPointerException e) {
            System.out.println("どうぐがセットされていません!");
            System.out.println("→ ピカチュウは自分の力で戦った!");
        }
    }
}

🖨 出力結果

どうぐがセットされていません!
→ ピカチュウは自分の力で戦った!

🏠 実生活のたとえ:空のコップで水を飲もうとした

水を入れていないコップでゴクッ… → 何もない!


✅ ここまでの例3-4のまとめ表

エラー名 意味 ポケモンの例 出力例
Exception 一般的なエラー PP不足で技が出せない 「代わりの技を使った!」
ArrayIndexOutOfBoundsException 配列の外を見た いないポケモンを呼び出す 「そんなポケモンいない!」
NullPointerException 中身がないものにアクセス どうぐがnullなのに使おうとする 「どうぐがありません!」

ありがとうございます!
それでは続編として、**「ユーザー定義の例外」「複数のcatch文の使い分け」**を、これまでと同様に ポケモンと実生活の具体例でわかりやすく解説していきます!


🔧 ユーザー定義の例外とは?

Javaには標準の例外クラス(NullPointerExceptionなど)がありますが、自分で作った例外クラスを使うことで、よりわかりやすく・意図を伝えるエラー処理ができます。


🌟 例5:ユーザー定義の例外「スタミナ不足Exception」

🎮 ポケモンの状況

カビゴンに「のしかかり」をさせようとしたが、スタミナが足りなかった! → 特別な理由なので、自分でエラーを作る!


💻 Javaコードで書くと…

// 自分で作った例外クラス
class StaminaTooLowException extends Exception {
    public StaminaTooLowException(String message) {
        super(message);
    }
}

public class KabigonBattle {
    public static void main(String[] args) {
        int stamina = 10;

        try {
            if (stamina < 50) {
                // 条件に合えば、自分で作った例外を投げる
                throw new StaminaTooLowException("カビゴンのスタミナが足りません!");
            }
            System.out.println("カビゴンののしかかり!");
        } catch (StaminaTooLowException e) {
            System.out.println(e.getMessage());
            System.out.println("→ カビゴンは休憩した!");
        }
    }
}

🖨 出力結果

カビゴンのスタミナが足りません!
→ カビゴンは休憩した!

🏠 実生活のたとえ:寝不足で運動会に出られない

運動会当日の朝、3時間しか寝てなかった → 「寝不足Exception」を投げて体育を休む!


🧠 なぜ使うの?

  • 通常のExceptionでは伝わりにくい「特別な理由」を明示できる
  • チーム開発などで意図が伝わりやすくなる

🎭 複数のcatch文の使い分け

いろんなトラブルが起こる可能性があるとき、それぞれに別々の対応をしたいときに使います!


🌪️ 例6:ポケモン道具と配列とnullチェックの複合例

🎮 ポケモンの状況

  • アイテムがnullの可能性がある
  • アイテム一覧から存在しない場所を読んでしまう可能性がある
  • どちらも起こるかもしれない!

💻 Javaコードで書くと…

public class MultiCatch {
    public static void main(String[] args) {
        String[] items = new String[3];
        items[0] = null; // どうぐがセットされていない

        try {
            // まず存在しないインデックスを見る → ArrayIndexOutOfBoundsException
            String item = items[5].toLowerCase();

            // もしnullが入っていたら → NullPointerException
            System.out.println("使うアイテムは:" + item);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("そんな番号のアイテムはありません!");
        } catch (NullPointerException e) {
            System.out.println("アイテムがセットされていません!");
        } catch (Exception e) {
            System.out.println("その他のエラーが発生しました:" + e.getMessage());
        }
    }
}

🖨 出力結果

そんな番号のアイテムはありません!

✅ 例5-6のポイント整理

特徴 内容 使用例
catch を複数使う 異なるトラブルに異なる対応 null、配列のはみ出しなど
ユーザー定義例外 独自の名前と意味をもったエラー スタミナ不足、マナー違反など
Exception の親子関係に注意 親クラスの catch は最後に書く Exception は一番下に置く

🎓 例1-6のまとめ

Javaの例外処理にはいろんなレベルがあります。

  • try + catch 基本の仕組み
  • ArrayIndexOutOfBoundsExceptionNullPointerException の対処
  • throw で自分から例外を投げる
  • ユーザー定義例外 を使ってオリジナルのエラーをつくる
  • catch を複数使ってエラーごとに別対応!

これらをうまく使うことで、予測不能な状況にも強い、やさしいプログラムが作れるようになります!


了解しました!
以下に、先ほどの例を「例7」からの連番として整理し直し、表記と構成もこれまでの形式に統一してお届けします。


🔚 例7:finally 文 〜バトル後の回復タイム〜

🎮 ポケモンの状況

バトルに成功しても失敗しても、バトル後には必ずポケセンで回復!


💻 Javaコードで書くと…

public class PokemonBattle {
    public static void main(String[] args) {
        try {
            System.out.println("ピカチュウ、でんこうせっか!");
            // 技が外れたとして例外発生
            throw new Exception("攻撃がはずれた!");
        } catch (Exception e) {
            System.out.println("エラー発生:" + e.getMessage());
        } finally {
            // ここは「必ず」実行される
            System.out.println("→ ピカチュウはポケモンセンターで回復しました!");
        }
    }
}

🖨 出力結果

ピカチュウ、でんこうせっか!
エラー発生:攻撃がはずれた!
→ ピカチュウはポケモンセンターで回復しました!

🏠 実生活のたとえ

お料理で焦がしても、うまく焼けても、必ず洗い物をする!


✅ 解説ポイント

  • finally ブロックは、例外が起きても・起きなくても必ず実行される
  • 主に「後片付け処理」や「ログ出力」などに使用

📁 例8:try-with-resources 〜ファイルを自動で閉じる〜

🎮 ポケモンの状況

サトシがバトルの記録をノートに書いたあと、閉じ忘れて雨でぐちゃぐちゃに!


💻 Javaコードで書くと…

import java.io.*;

public class Diary {
    public static void main(String[] args) {
        // tryの()内でファイルを書き込み用に開く
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("pokemon_diary.txt"))) {
            writer.write("ピカチュウがライチュウに進化した!");
            System.out.println("→ バトル日記を保存しました。");
        } catch (IOException e) {
            System.out.println("ファイル保存中にエラー:" + e.getMessage());
        }
    }
}

🖨 出力結果

→ バトル日記を保存しました。

📁 ※ ファイルは自動的に閉じられ、閉じ忘れによるトラブルを防ぎます。


🏠 実生活のたとえ

自動でノートを閉じてくれる文房具みたいなイメージです。


✅ 解説ポイント

  • try(...) の括弧内に書かれたリソースは自動で閉じられる
  • ファイルやネット接続などの後始末がラクに、安全になる!

🪤 例9:その他の応用テクニック


① 複数catchを1つにまとめる(Java 7以降)

try {
    // 処理中にいろんな問題が起きるかも…
} catch (IOException | NullPointerException e) {
    System.out.println("IOエラーまたはnullです:" + e.getMessage());
}

📌 似たような対処をしたい場合は1つのcatchに統合できます!


② 例外の再スロー(throw again)

try {
    throw new IOException("ファイルが読めません");
} catch (IOException e) {
    System.out.println("ログ記録:" + e.getMessage());
    throw e; // 外にもう一度投げる
}

📌 エラーの報告だけして、処理は上の人(上のコード)に任せる


throwthrows の違い

用語 説明 使用例
throw 実際に例外を「投げる」 throw new Exception("エラー")
throws メソッドが例外を「投げるかも」と宣言する public void doSomething() throws Exception

✅ 例7-9まとめ

内容 ポケモンのたとえ
例7 finally:絶対に実行 バトル後の回復
例8 try-with-resources:自動後始末 ノートを自動で閉じる
例9 複数catchや再スローなど 対応を一括化・責任を渡す

承知しました!
最後に「チェック例外 vs 非チェック例外の違い」と「実務でのベストプラクティス」について、例10から始めて丁寧に解説します。
これまでと同様に、ポケモンの例実生活の例を交え、中学生にも理解できるように構成しています。


⚖️ 例10:チェック例外 vs 非チェック例外(Runtime例外)の違い


📚 用語のおさらい

種類 説明 特徴
チェック例外 Javaで「この例外は必ず対処しなさい」と指示されるもの コンパイル時にcatchまたはthrowsが必要
非チェック例外(RuntimeException) Javaで「対処してもしなくてもいいよ」とされるもの 予測困難・コードミス系が多い

🎮 ポケモンでたとえると…

◯ チェック例外

📦 サトシが荷物を送るとき、「壊れ物です!扱いに注意してね」と必ず伝える必要がある。
(→ Javaでも開発者が対処を強制される

◯ 非チェック例外(Runtime)

🌀 サトシが急に道に迷う!地図を持ってなかった!
(→ Javaでも突然のNullPointerExceptionなどが勝手に発生する


💻 チェック例外のコード例

import java.io.*;

public class CheckedExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("data.txt")); // ファイルがないかも
        } catch (IOException e) {
            System.out.println("ファイルが見つかりません!");
        }
    }
}

ファイル読み込みなど、現実世界のエラーに多い


💻 非チェック例外のコード例

public class UncheckedExample {
    public static void main(String[] args) {
        String name = null;
        System.out.println(name.toUpperCase()); // ← null で例外が出る
    }
}

プログラマーのミスやバグに由来することが多い


🧠 実生活のたとえ

種類 実生活での例 たとえ
チェック例外 郵便を送るとき「割れ物注意」が必須 明らかに気をつけるべきこと
非チェック例外 スマホを急に落とす 予測が難しくて突然起きること

💼 例11:実務でのベストプラクティス


✅ 基本方針

原則 内容
❶ 例外は使いすぎない 例外は特別な事態用。通常のフローには使わない
チェック例外は明示的に処理する ユーザーのミスや外部環境の影響に備える
RuntimeExceptionは防げるようコードで対策 Nullチェック、バリデーションの徹底
❹ エラー内容は具体的なメッセージで出す 何が悪かったのか、次に何をすればいいか明示
finallytry-with-resources後始末を忘れない ファイル、ネット接続、データベースなど必ず閉じる

🎯 実務でありがちなNGとOK

状況 NG例 OK例
Nullチェック いきなり .toUpperCase() if (name != null)
ファイル操作 開いて閉じ忘れる try-with-resources を使う
catchブロック 何も書かずに握りつぶす ログに記録して次の処理をする
エラーメッセージ 「エラーが起きました」 「入力ファイルが存在しません」

🎮 ポケモン実務編(イメージ)

  • サトシが「モンスターボールが壊れてるかも」と思ったら、事前にチェックするのが正解
  • それでも壊れてたら、ちゃんとエラーとして伝えて対処

🧠 例10-11のまとめ

内容 ポケモンたとえ
例10 チェック例外 vs 非チェック例外 荷物と落とし物の違い
例11 実務での使い方の工夫 エラーを防ぐ・伝える・片付ける

これで、Javaの例外処理の入門から実践レベルまでを網羅しました!

Discussion