System.out.println("Java学習中");

【Java / Spring Boot】UI/UXの視点を活かしたバックエンド開発の学習ポートフォリオ

【Java Silver対策】「substring」と「switch式」について

水晶を管理しているギルドマスター(Adobe Fireflyで作成)

🟢 はじめに

Javaを学んでいると、

「一見正しく動きそうなのに、なぜかコンパイルエラーになる…」

という場面に出くわすことがあると思います。

今回は、Java Silver特有の「ひっかけ問題」について解説してみたいと思います。

テーマは、

「文字の切り出し(substring)」

「結果を変数に入れる(switch式)」

です。


💻 問題(ソースコード)

まずは、以下のコードを見てみましょう。

ダンジョンで見つけた「古文書の暗号」を解読し、それに応じた「魔石」を手に入れるプログラムです。

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行目。

String secretCode = "FLAME_AQUA_WIND".substring(6, 10);

substringは、文字のヒモ(文字列)を指定した場所でチョキンと切り取る効果があります。

ここで覚えておきたいJavaのルールが、

「数を数える時は『0』からスタートする」

ということです。

文字の下に、番地(インデックス)を振ってみます。

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) は、

「6番目から、10番目の手前まで」

を切り取ります。

つまり、secretCode の中には "AQUA" という文字列が入ります。


🔮 ステップ2:「鑑定の水晶」の厳格なルール

次に、エラーの原因となっている switch の部分を見てみましょう。

ここでの switch は、結果を

magicStone という変数に代入

していますよね。

このように

「結果を変数に直接返すswitch」

のことを

『switch式』

と呼びます。

この『switch式』を、

マニュアルにないモノを入れられるとフリーズしてしまう「超・厳格な鑑定の水晶」

だと想像してください。

FLAMEを入れる 👉 「炎の魔石」を出す

AQUAかICEを入れる 👉 「水の魔石」を出す

WINDを入れる 👉 「風の魔石」を出す

さて、この水晶を管理しているギルドマスター(Javaのコンパイラ)がこう言いました。

ギルドマスター

ギルドマスター

「もし呪文が『DARK』とか『LIGHT』だったらどうするんだ!?この水晶は『必ず何か結果を返す』約束になっているのに、マニュアルにない呪文が来たらパニックになって壊れてしまうだろう?『その他』の場合の対応マニュアルがないから、この水晶は使わせんぞ!(=コンパイルエラー)」

secretCode単なる文字列(Stringなので、"AQUA" 以外にもどんな文字が入ってくるか予測できません。

それなのに、

想定外の文字が来た時の対応

が書かれていないため、Java「危険だから動かさない!」エラーを出してしまうのです。

この厳格なルールのことを

「網羅性(もうらせい)」

と呼びます。


🛠️ 解決策:水晶に「その他」の対応を教えよう

このエラーを直すのは簡単です。

水晶(switch式)に、

「マニュアルにない呪文が来た時はコレを返してね」という default のルール

を追加してあげればOKです。

// エラーを修正した正しいコード
String magicStone = switch (secretCode) {
    case "FLAME": yield "炎の魔石";
    case "AQUA", "ICE": yield "水の魔石";
    case "WIND": yield "風の魔石";
    default: yield "ただの石ころ"; // 👈 これを追加!「その他の場合はコレ」
};

このように default を追加することで、ギルドマスター(コンパイラ)

ギルドマスター

ギルドマスター

「これならどんな呪文が来ても安心だ!」

と納得してくれます。

無事にコンパイルが通り、画面には

手に入れたのは:水の魔石

と表示されるようになります。


📝 まとめ

🔹substring(開始, 終了)は、「開始位置」から「終了位置の手前」までを切り取る(数え方は0から)

🔹結果を変数に入れる『switch式』は、すべての可能性をカバーしないとエラーになる

🔹文字列のswitch式には、必ず default が必要

Java学習中の方の参考になれば幸いです🙌


【プロフィール・作品置き場】

kenichikamoi.com


🎵 Youtube(楽曲一覧)はこちら

www.youtube.com