
🟢 はじめに
Javaを学んでいると、
という場面に出くわすことがあると思います。
今回は、Java Silver特有の「ひっかけ問題」について解説してみたいと思います。
テーマは、
と
です。
💻 問題(ソースコード)
まずは、以下のコードを見てみましょう。
ダンジョンで見つけた「古文書の暗号」を解読し、それに応じた「魔石」を手に入れるプログラムです。
public class Main { public static void main(String[] args) { // ① 古文書から魔法の呪文を切り出す String secretCode = "FLAME_AQUA_WIND".substring(6, 10); // ② 呪文を「鑑定の水晶」に入れて魔石を作る(switch式) String magicStone = switch (secretCode) { case "FLAME": yield "炎の魔石"; case "AQUA", "ICE": yield "水の魔石"; case "WIND": yield "風の魔石"; }; System.out.println("手に入れたのは:" + magicStone); } }
このコード、パッと見ると AQUA に反応して "水の魔石" がもらえそうですよね。
しかし、これを実行しようとすると
になってしまいます。
なぜ動かないのでしょうか?
順番に謎を解き明かしていきたいと思います。
🗡️ ステップ1:古文書をハサミで切り取る substring
まずは最初の1行目。
substringは、文字のヒモ(文字列)を指定した場所でチョキンと切り取る効果があります。
ここで覚えておきたいJavaのルールが、
ということです。
文字の下に、番地(インデックス)を振ってみます。
F,L,A,M,E,_,A,Q,U,A,_,W,... 0,1,2,3,4,5,6,7,8,9,10,11,...
substring(6, 10) は、
を切り取ります。
つまり、secretCode の中には "AQUA" という文字列が入ります。
🔮 ステップ2:「鑑定の水晶」の厳格なルール
次に、エラーの原因となっている switch の部分を見てみましょう。
ここでの switch は、結果を
していますよね。
このように
のことを
と呼びます。
この『switch式』を、
だと想像してください。
AQUAかICEを入れる 👉 「水の魔石」を出す
WINDを入れる 👉 「風の魔石」を出す
さて、この水晶を管理しているギルドマスター(Javaのコンパイラ)がこう言いました。
「もし呪文が『DARK』とか『LIGHT』だったらどうするんだ!?この水晶は『必ず何か結果を返す』約束になっているのに、マニュアルにない呪文が来たらパニックになって壊れてしまうだろう?『その他』の場合の対応マニュアルがないから、この水晶は使わせんぞ!(=コンパイルエラー)」
secretCode は単なる文字列(String)なので、"AQUA" 以外にもどんな文字が入ってくるか予測できません。
それなのに、
が書かれていないため、Javaは「危険だから動かさない!」とエラーを出してしまうのです。
この厳格なルールのことを
と呼びます。
🛠️ 解決策:水晶に「その他」の対応を教えよう
このエラーを直すのは簡単です。
水晶(switch式)に、
を追加してあげればOKです。
// エラーを修正した正しいコード String magicStone = switch (secretCode) { case "FLAME": yield "炎の魔石"; case "AQUA", "ICE": yield "水の魔石"; case "WIND": yield "風の魔石"; default: yield "ただの石ころ"; // 👈 これを追加!「その他の場合はコレ」 };
このように default を追加することで、ギルドマスター(コンパイラ)も
「これならどんな呪文が来ても安心だ!」
と納得してくれます。
無事にコンパイルが通り、画面には
と表示されるようになります。
📝 まとめ
🔹結果を変数に入れる『switch式』は、すべての可能性をカバーしないとエラーになる
🔹文字列のswitch式には、必ず default が必要
Java学習中の方の参考になれば幸いです🙌