条件分岐と言えば if文ですが、一部の条件分岐についてはswitch文で書いたほうが分かりやすいことがあります。
例えば、以下の仕様を考えてみます。
これを if文を用いて実装すると、以下のようなプログラムになります。
E201/MySystem.java
(ライブラリをそのまま利用します)
E201/E201.java
/** * 園児の組を表示します(if文を使用) */ public class E201 { /** * メインメソッド * @param args 引数 */ public static void main(String[] args) { int now; now = MySystem.in.getInt("入園何年目ですか"); if(now == 1) { System.out.println("年少ですね"); } else if(now == 2) { System.out.println("年中ですね"); } else if(now == 3) { System.out.println("年長ですね"); } } }
同じプログラムを switch文で実現してみます。予約語switch
、case
、break
を使用します。
E202/MySystem.java
(ライブラリをそのまま利用します)
E202/E202.java
/** * 園児の組を表示します(switch文を使用) */ public class E202 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int now; now = MySystem.in.getInt("入園何年目ですか"); switch(now) { case 1: System.out.println("年少ですね"); break; case 2: System.out.println("年中ですね"); break; case 3: System.out.println("年長ですね"); break; } } }
実行結果の例は以下の通り。
入園何年目ですか? 2 年中ですね
入園何年目ですか? 6
switch文のほうがすっきりしているように感じられるでしょうか。もし気に入ったなら使ってみてください。
なお、switch文の中のインデントは少し特殊です。case
の行はインデントをしないことに注意してください。
ここでは 2つ以上の caseで同じ処理をさせたいときの方法と、予約語default
について学習します。
プログラムの仕様を以下に定めました。
この仕様を満たすプログラムは以下の通り。
E203/MySystem.java
(ライブラリをそのまま利用します)
E203/E203.java
/** * 小学生の呼び名を表示します。 */ public class E203 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int now; now = MySystem.in.getInt("小学何年生ですか"); switch(now) { case 1: case 2: System.out.println("低学年ですね"); break; case 3: case 4: System.out.println("中学年ですね"); break; case 5: case 6: System.out.println("高学年ですね"); break; default: System.out.println("異常な値が入力されました"); break; } } }
実行結果の例は以下の通り。
小学何年生ですか? 5 高学年ですね
小学何年生ですか? 100 異常な値が入力されました
case
で複数の値を指定したい場合は、このように複数並べます。また、default
は、どのcase
にも該当しなかった場合に処理を記述します。if文で言うところのelse
のような存在ですね。
気をつけていないとよくやってしまうことが、break;
の書き忘れです。書き忘れてもビルドエラーにはならないため、気づかないままでいてバグの原因になることがあります。
さきほどのプログラムを基にbreak;
を削除してみたものが以下になります。
E204/MySystem.java
(ライブラリをそのまま利用します)
E204/E204.java
/** * 小学生の呼び名を表示します。 * breakつけ忘れのため、バグあり。 */ public class E204 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int now; now = MySystem.in.getInt("小学何年生ですか"); switch(now) { case 1: case 2: System.out.println("低学年ですね"); case 3: case 4: System.out.println("中学年ですね"); case 5: case 6: System.out.println("高学年ですね"); default: System.out.println("異常な値が入力されました"); } } }
実行結果の例は以下の通り。
小学何年生ですか? 1 低学年ですね 中学年ですね 高学年ですね 異常な値が入力されました
ご覧のようにバグが発生しています。せっかくcase
で捉えたものの、break;
の書き忘れによって、次へ次へとプログラムが実行されてしまっています。break;
忘れには気をつけましょう。