
🟢 はじめに
Javaのプログラミングを学んでいると、必ず出会うのが条件分岐の switch 文だと思います。
一見シンプルに見えますが、実は初心者が引っかかりやすい「3つの罠」が隠されています。
今回は、Java Silverの試験対策としても重要だと言われているこの罠について、「ダンジョン探索」に例えながら分かりやすく解説します。
【サンプルコード】
まずは、今回探検するダンジョン(コード)を見てみましょう。
public class SwitchDungeon { public static void main(String[] args) { System.out.println("=== 罠その1:滑り落ちる床 ==="); String item = "ポーション"; switch (item) { case "ポーション": System.out.println("HPを回復した!"); // ⚠️ ここに break; がない! case "毒消し": System.out.println("毒が治った!"); break; default: System.out.println("効果がなかった..."); } System.out.println("\n=== 罠その2:裏口(default)からの落下 ==="); String monster = "ドラゴン"; switch (monster) { default: System.out.println("逃げ出した!"); // ⚠️ ここにも break; がない! case "スライム": System.out.println("スライムを倒した!"); break; case "ゴブリン": System.out.println("ゴブリンを倒した!"); break; } System.out.println("\n=== 罠その3:見えないカギ ==="); String key = null; // ⚠️ 以下のコメントアウトを外すとエラーでゲームオーバーになります /* switch (key) { case "金の鍵": System.out.println("宝箱を開けた!"); break; } */ } }
【解説部分】
罠その1:break; 忘れによる「フォールスルー(滑り落ちの罠)」
コードの最初の部分を見てください。
勇者は「ポーション」を持って部屋に入りました。
当然「HPを回復した!」と表示されますが、その後に break;(脱出ワープ)がありません。
switch 文では、break; がないと床が抜けて下の部屋(次のcase)へどんどん落ちてしまいます。
結果として、毒状態でもないのに「毒が治った!」まで実行されてしまうのです。
これをフォールスルーと呼びます。
✅ ポイント: break; がないと、条件に関係なく下へ下へと処理が実行され続ける!
罠その2:defaultは一番下とは限らない!
2つ目の罠です。
「ドラゴン」に遭遇しましたが、case には「スライム」と「ゴブリン」しかありません。
該当する扉がない場合、合鍵の扉である default に進みます。
ここで注目すべきは、default が一番上に書かれていることです。
default はどこに書いても「一致するcaseがない場合」のスタート地点になります。
しかし、ここでも break; がないため、「逃げ出した!」の後に床が抜け、下の「スライムを倒した!」まで実行されてしまいます。
✅ ポイント: default は一番下になくてもOK!ただし break; がないとやっぱり下へ落ちる!
罠その3:nullを渡すと即ゲームオーバー(NullPointerException)
最後の罠はとても凶悪です。
カギの変数に null(カギの実体がない・透明なカギ)を持たせて switch ダンジョンに入ろうとするとどうなるでしょうか?
Java(門番)は「カギがないじゃないか!」と怒り出し、NullPointerException というエラーを吐いてゲーム(プログラム)が強制終了してしまいます💥
✅ ポイント: switch(変数) の変数に null を入れるとエラーで強制終了になる!
【まとめ】
いかがだったでしょうか?
switch 文を書くときは、以下の3つを確認すると良いと思います。
1️⃣ フォールスルー: break;(脱出ワープ)はちゃんと書いた?
2️⃣ defaultの位置: 上にあっても機能するけど、その後の break; は大丈夫?
3️⃣ Nullエラー: カッコの中身が null になる可能性はない?
Java学習中の方の参考になれば幸いです🙌