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が重なる場合は、終了対象に印を付けると読み違いを避けられます。

図解

一致から終了まで
各caseは独立したif文ではなく、途中から入る文列の入口。

重要ポイント

  • Java 11のswitch文はbyte/short/char/intと対応ラッパー、String、enumを扱う。
  • long・boolean・doubleは選択式に使えない。
  • caseに一致した後はbreak等まで後続文を実行する。
  • caseは互換性のある定数で重複できない。

間違えやすい点

  • caseに一致するたび条件を再判定すると思わない。
  • defaultを常に最後の処理と考えない。
  • nullをdefaultが受けると思わない。

用語解説

caseラベル
値が一致したときに実行を開始する場所を示す記述。
フォールスルー
breakせず後続ラベル側の文へ進む動作。
defaultラベル
一致するcaseがない場合の開始位置。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。