switchのコードトレース
switch文は一つの値に対してcaseラベルから実行の開始位置を選びます。Java 11のコロン形式を使い、breakの有無、default、選べる型とcase定数の制約を理解します。
この単元で学ぶこと
- case一致からの実行順を追う
- breakとフォールスルーを区別する
- switch対象型とcaseラベルの条件を判定する
本文解説
defaultが先頭でも一致優先 switch(n){default:print("D");case 1:print("A");}でn=1ならcase 1から入ってAだけです。defaultが最初に書かれていても、まず一致するcaseを選びます。n=9ならdefaultへ入り、その後case 1へ流れてDAです。
途中のdefaultと終了 defaultが途中にある場合も、case一致から実行した結果そこへ流れることがあります。defaultが実行されるのは不一致の場合だけとは限りません。ラベル選択の役割と、選択後の文の流れを分ける必要があります。
空のcaseをまとめる case 1:case 2:print("small");break;は1と2で同じ処理を行います。case 1の文が空なので、1で入った場合も2の後の表示に進みます。この書き方はフォールスルーを意図的に利用したグループ分けです。
内部の代入は再選択しない int n=1;switch(n){case 1:n=2;print("A");break;case 2:print("B");}はAだけです。途中でnが2になってもcase 2へジャンプしません。breakがなければBも出ますが、それは再選択ではなく後続文へ流れた結果です。
ラッパー型のnull Integer n=nullをswitchへ渡すと、値を取り出すアンボクシングでNullPointerExceptionです。defaultはnullを吸収しません。Integer n=2なら対応するint値でcase 2を選びます。宣言型の合法性と値の安全性を分けます。
定数変数の条件 final int k=1+1はcase定数に使えますが、final int k=Integer.parseInt("2")は使えません。finalは再代入禁止であって、すべての値がコンパイル時に決まるという意味ではありません。定数式で初期化されたプリミティブ型やStringの定数変数が対象です。
caseをまたぐ変数 caseは新しいブロックスコープを作りません。case 1:int x=1;break;case 2:int x=2;は同じswitchブロックで重複宣言となります。caseごとに{...}を置けば別スコープにできます。前のcaseの初期化を飛ばして後から入る経路にも注意します。
breakの対象 ループ内のswitchで使ったラベルなしbreakは最も内側のswitchを抜けます。外側ループを終了するとは限りません。switch後の共通文や次の反復も含めて追跡します。ループとswitchが重なる場合は、終了対象に印を付けると読み違いを避けられます。
図解
重要ポイント
- Java 11のswitch文はbyte/short/char/intと対応ラッパー、String、enumを扱う。
- long・boolean・doubleは選択式に使えない。
- caseに一致した後はbreak等まで後続文を実行する。
- caseは互換性のある定数で重複できない。
間違えやすい点
- caseに一致するたび条件を再判定すると思わない。
- defaultを常に最後の処理と考えない。
- nullをdefaultが受けると思わない。
用語解説
- caseラベル
- 値が一致したときに実行を開始する場所を示す記述。
- フォールスルー
- breakせず後続ラベル側の文へ進む動作。
- defaultラベル
- 一致するcaseがない場合の開始位置。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。