switch文では分岐を指定するためにcaseラベルとdefaultラベルを用います。その多くの場合はcaseで処理すべき値を列挙した上で、一致しない処理を記述するためにdefaultラベルを記述します。この時、defaultラベルを列挙するcaseの間に含めると、default以降のcaseは使われるのでしょうか?
端的に答えを示すと、caseやdefaultは上から順に評価されるのではなく、caseで明示されない値を処理する場合にdefaultが実行されます。
次のコードで検証してみました。第1引数を数値に変換し、switch文に渡します。switch文はcaseで1, 2, 3を指定し、それ以外は2と同じ処理になるよう記述したものです。
$ cat SwitchDefault.java // vim: tw=0 ts=4 sw=4 sts=4 et public class SwitchDefault { public static void main(String[] args) { int index = Integer.parseInt(args[0]); switch (index) { case 1: System.out.println("1"); break; case 2: default: System.out.println("2"); return; case 3: System.out.println("3"); break; } } }
次が実行結果になります。1, 2, 3はcaseで明示しているので、それぞれの処理が実行されます。特に3はdefault以降に存在しますが、正しく処理されて3が表示されています。
$ java -version java version "1.7.0_75" OpenJDK Runtime Environment (rhel-2.5.4.7.el7_1-x86_64 u75-b13) OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode) $ java SwitchDefault 1 1 $ java SwitchDefault 2 2 $ java SwitchDefault 3 3 $ java SwitchDefault 4 2 $ java SwitchDefault 5 2 $ java SwitchDefault 6 2
この挙動については14.11. The switch Statementに記述されています。
defaultラベル以降もcaseを記述することは可能ですが、breakしてswitch文を抜ける場合はdefaultを最後においた方が読みやすくなると思います。
Leave a Reply