🟢 はじめに
Javaの勉強をしていると、if文のほかにswitch文という条件分岐に出会いますよね。
今回は、このswitch文で使える便利な「複数条件のまとめ方」と、初心者がうっかりハマりやすい「フォールスルーの罠」について、RPGゲームに例えて解説します。
📜 今回のサンプルコード:冒険者ギルドのクエスト受付
まずは、ギルドのランク(S, A, B, C...)に合わせて、受付のお姉さんがクエストを案内してくれるプログラムを見てみましょう。
public class GuildQuest {
public static void main(String[] args) {
// 主人公の現在のギルドランク
String rank = "A";
System.out.println("あなたのランクは「" + rank + "」ですね!");
System.out.println("ーーー クエスト開始 ーーー");
switch (rank) {
case "S":
System.out.println("【激闘】ドラゴンの討伐!🐉");
break;
case "A":
System.out.println("【危険】ゴーレムの討伐!🪨");
// 🚨 ここに注目!あえて「break;」を書いていません!
case "B", "C":
System.out.println("【通常】薬草の採取🌿");
break;
default:
System.out.println("【安全】町内のお掃除🧹");
break;
}
}
}
このコードを実行すると、一体どうなるでしょうか?
実は、ちょっと予想外のハプニングが起こってしまいます……!
解説ポイント1:便利な魔法「カンマ区切り」で条件をまとめる!
コードの中にあるこの部分に注目してください。
case "B", "C":
System.out.println("【通常】薬草の採取🌿");
break;
これは「Bランク、またはCランクの人は、この扉を開けてね!」という共通のルールです。
以前のJavaでは、わざわざcase "B":とcase "C":を別々に書く必要がありましたが、新しいバージョンではカンマ(,)を使ってスッキリまとめることができるようになりました。
同じ処理をさせたい条件が複数あるときは、この「カンマ区切り」を使うと、コードがとても読みやすくなります!
解説ポイント2:恐怖の罠「フォールスルー」とは?
さて、今回の主人公は「Aランク」です。
本来なら「ゴーレムの討伐」だけを任されるはずですが、実行結果はこうなります。
【実行結果】
あなたのランクは「A」ですね!
ーーー クエスト開始 ーーー
【危険】ゴーレムの討伐!🪨
【通常】薬草の採取🌿
ゴーレムを倒したあとに、B・Cランク向けの「薬草の採取」までやらされてしまっています💦
なぜこんなブラックな働き方になってしまったのでしょうか?
その原因が「フォールスルー(Fall-through)」という現象です。
switch文の各部屋には、本来「お宝を取ったら脱出する呪文(break;)」が必要です。
しかし、今回のコードのcase "A":の下にはbreak;が書かれていません。
break;がないと、プログラムは「まだ処理が続いている!」と勘違いし、床に穴が開いたかのように、下の階(case "B", "C":)へとズルズル落下してしまうのです。
これがフォールスルー(突き抜け)です。
🛡️ 罠を防ぐためのお約束
わざと下の階の処理も一緒にやらせたい(連続クエストにしたい)場合を除いて、基本的には1つのcaseが終わったら必ずbreak;を書くのが安全な冒険のお約束です。
case "A":
System.out.println("【危険】ゴーレムの討伐!🪨");
break; // ← これを忘れない!
このようにブレーキをかけてあげれば、主人公は無事にゴーレム討伐だけでギルドに帰ることができます。
📝 まとめ
-
case "B", "C":➡ カンマで繋げば「どちらか」の条件を1つにまとめられて便利
フォールスルー ➡ break;を書き忘れると、下の条件までズルズル実行されてしまう
Java学習中の方の参考になれば幸いです🙌