if文で多くの分岐が発生し、else ifを何度も書かないといけない場合、switch文を使って見やすく書くことが出来ます。
しかし、switch文を書くにあたって見落としやすい点があります。
それはcaseの最後にbreak;を書かずに予想外の動作をしてしまうことです。
今回はcaseの最後にbreak;を書かないとどうなるのか?
動作を見ながらbreak;が必要な理由を説明していきます。
switch文のcase:の最後にbreak;を書かないとどうなるのか?
では、まず、switch文のcaseの最後にbreak;を書かないとどうなるのか?
以下のサンプルコードを用いて説明してみます。
//switch分のcase:内の処理にbreak;を書かない場合
public void swNoBreak() {
int num1 = 5;
int num2 = 2;
switch(num2) {
//num2が0の場合はnum2を普通に加算
case 0:
num1 = num1 + num2;
//num2が1の場合はnum2を2倍したものを加算
case 1:
num1 = num1 + num2 * 2;
//num2が2の場合はnum2を3倍したものを加算
case 2:
num1 = num1 + num2 * 3;
//num2が3の場合はnum2を4倍したものを加算
case 3:
num1 = num1 + num2 * 4;
//num2が4の場合はnum2を5倍したものを加算
case 4:
num1 = num1 + num2 * 5;
//num2が5の場合はnum2を6倍したものを加算
case 5:
num1 = num1 + num2 * 6;
//num2が1~5のいずれでもない場合はnum2を10倍したものを加算
default:
num1 = num1 + num2 * 10;
}
//ここで出力されるのは11?
System.out.println(num1);
}
このソースではnum2=2なので、14行目のcase 2:のところを通り、5+2×3=11となるはず・・・。
ですが、実際の動作は以下のようになります。
最後に出力したnum1の値が61という結果になりました。
これはどういうことかというと、まずはcase 2:の処理を通った後、そのまま case 3:、case 4:、case 5:、default:の処理を通ってしまい、最終的に61という計算結果になってしまいました。
switch文のcase文の最後にbreak;を入れないと、値が一致したcaseの場所に移動した後、そこから後の処理をすべて実行しようとしてしまいます。
この動作はCやJavaを使う場合はきちんと理解しておかなければならず、知らずにコードを書いてしまうと予想外の処理が出来てしまう可能性があります。
なので、絶対に今回書いたようなサンプルコードを書くことがないように、次の章で紹介するコードのようにbreak;をそれぞれのcaseに入れるようにしてください。
switch文のcase:の最後にbreak;を書いた場合
それでは、switch文の各caseの最後にbreak;を入れてみましょう。
コードを以下のように書いてみます。
//switch分のcase:内の処理にbreak;を書いた場合
public void swBreak() {
int num1 = 5;
int num2 = 2;
switch(num2) {
//num2が0の場合はnum2を普通に加算
case 0:
num1 = num1 + num2;
break;
//num2が2の場合はnum2を3倍したものを加算
case 1:
num1 = num1 + num2 * 2;
break;
//num2が2の場合はnum2を3倍したものを加算
case 2:
num1 = num1 + num2 * 3;
break;
//num2が3の場合はnum2を4倍したものを加算
case 3:
num1 = num1 + num2 * 4;
break;
//num2が4の場合はnum2を5倍したものを加算
case 4:
num1 = num1 + num2 * 5;
break;
//num2が5の場合はnum2を6倍したものを加算
case 5:
num1 = num1 + num2 * 6;
break;
//num2が1~5のいずれでもない場合はnum2を10倍したものを加算
default:
num1 = num1 + num2 * 10;
break;
}
//ここで出力されるのは11
System.out.println(num1);
}
default:の最後のbreak;は必ず書かなければいけないものではありませんが、慣習的にbreak;を書いているコードを見ることが多いので、このコードでもdefault:の最後にbreak;を入れています。
では、動作を見てみましょう。
このように、case 2:の部分だけ通って、switch文を終了していることが分かります。
基本的にswitch文を複数のcaseに渡って処理させることは稀ですし、ソースの可読性の問題もあるため、絶対にそんな書き方はしてはいけません。
switch文を書く時はそれぞれのcaseで完結する。
この考え方は実際のプログラムを書く時には絶対に意識してください。
break;文を書き忘れると、switch文を使っても期待した動作にならなくなります。
まとめ
今回はswitch文のcase内のbreak;についてお話ししました。
今回覚えておきたい点は以下の通りです。
- switch文を書くのであれば、case内のbreak;は必ず書く(おまじないレベルで覚えておくこと)。
- case内のbreak;を書き忘れると次のcaseの処理を続けて処理してしまう
- 複数のcase:に渡る処理は書かず、1つのcase内で処理を完結するようにコードを書くこと
今回の内容は基礎的なもので、「言われなくても分かっている」と思われる方も多いかもしれません。
しかし、このような基礎知識をしっかり理解しているかどうかが、実務でプログラムを書く上で重要になってきます。
学校での演習ではミスしても問題ありませんが、実務でミスを起こすとバグに繋がります。
break;の入れ忘れは見つけにくいバグにはなりませんが、必ずswitch文のcaseにはbreak;を入れることを忘れずにコードを書く意識を持つようにしましょう。
今回の記事はここまでとなります。
また次回の記事でお会いしましょう。