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には必ず値が要ります。
直し方: case を default にします。
パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。