0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

💥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の例外処理の入門から実践レベルまでを網羅しました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?