Code Fix

中級

switch で break を忘れるとどうなるか

次のcaseへ落ちるフォールスルーの挙動と、defaultの役割、String switchの書き方を扱います。

なぜエラーが出ないのか

出力: one / two
(エラーなし)
javacは何も報告しません。文法として正しいためです
出力: one / two
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      public static void main(String[] args) {
 3          int n = 1;
 4          switch (n) {
 5              case 1:
 6                  System.out.println("one");
 7                              
                          ^
 8              case 2:
 9                  System.out.println("two");
10          }
11      }
12  }
出力: one / two期待: one (コンパイルは通っています)

caseはbreakがないと次のcaseへ落ちます。これをフォールスルーと呼びます。

直し方: (空)break; にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  public class Main {
 2      public static void main(String[] args) {
 3          int n = 9;
 4          switch (n) {
 5              case 1: System.out.println("one"); break;
 6              case     : System.out.println("other");
                    ^
 7          }
 8      }
 9  }
Main.java:6: error: illegal start of expression

どのcaseにも当たらないときの受け皿はdefaultです。caseには必ず値が要ります。

直し方: casedefault にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2      public static void main(String[] args) {
 3          String cmd = "go";
 4          switch (cmd) {
 5              case go  : System.out.println("moving"); break;
                       ^
 6          }
 7      }
 8  }
Main.java:5: error: cannot find symbol symbol: variable go

switchでStringを扱うときも、caseの値は文字列リテラルとして書きます。

直し方: go"go" にします。

この問題を解いてみる →

よくある誤解

フォールスルーはバグではなく仕様です。複数のcaseを同じ処理にまとめるときに、意図して使います。

まとめ

switch で break を忘れるとどうなるかは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)