💥Javaの例外処理をポケモンで学ぼう!
プログラムには、予想外のトラブルが起きることがあります。
Javaではそのような「問題が起きたとき」に、プログラムが止まらないように**例外処理(Exception Handling)**を使います。
今回は、ポケモンの世界と実生活を使って、楽しく学んでみましょう!
🔖 目次(逆引き付き)
- ✅ 例1:技の使用失敗時に例外処理を使う(PP不足)
- ✅ 例2:財布にお金がないときの処理(現実的な例)
- ⚠️ 例3:配列の外を参照してしまったとき(ArrayIndexOutOfBoundsException)
- ⚠️ 例4:nullのまま使おうとしてしまったとき(NullPointerException)
- 🛠 例5:スタミナ不足など独自のエラーを作りたいとき(ユーザー定義例外)
- 🎯 例6:複数種類のエラーにそれぞれ対応したいとき(catchの使い分け)
- 🔚 例7:処理後に必ず実行したいことがあるとき(finally)
- 📁 例8:ファイルなどを自動で閉じたいとき(try-with-resources)
- 🪤 例9:複数のcatch統合/例外の再スロー/throwとthrowsの違い
- ⚖️ 例10:チェック例外と非チェック例外の違いを理解したいとき
- 💼 例11:実務で例外処理をどう書けばいいか知りたいとき(ベストプラクティス)
🟡 例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
基本の仕組み - ✅
ArrayIndexOutOfBoundsException
やNullPointerException
の対処 - ✅
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; // 外にもう一度投げる
}
📌 エラーの報告だけして、処理は上の人(上のコード)に任せる。
③ throw
と throws
の違い
用語 | 説明 | 使用例 |
---|---|---|
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チェック、バリデーションの徹底 |
❹ エラー内容は具体的なメッセージで出す | 何が悪かったのか、次に何をすればいいか明示 |
❺ finally やtry-with-resources で後始末を忘れない |
ファイル、ネット接続、データベースなど必ず閉じる |
🎯 実務でありがちなNGとOK
状況 | NG例 | OK例 |
---|---|---|
Nullチェック | いきなり .toUpperCase()
|
if (name != null) |
ファイル操作 | 開いて閉じ忘れる |
try-with-resources を使う |
catchブロック | 何も書かずに握りつぶす | ログに記録して次の処理をする |
エラーメッセージ | 「エラーが起きました」 | 「入力ファイルが存在しません」 |
🎮 ポケモン実務編(イメージ)
- サトシが「モンスターボールが壊れてるかも」と思ったら、事前にチェックするのが正解
- それでも壊れてたら、ちゃんとエラーとして伝えて対処
🧠 例10-11のまとめ
例 | 内容 | ポケモンたとえ |
---|---|---|
例10 | チェック例外 vs 非チェック例外 | 荷物と落とし物の違い |
例11 | 実務での使い方の工夫 | エラーを防ぐ・伝える・片付ける |
これで、Javaの例外処理の入門から実践レベルまでを網羅しました!