問題
次のコードをコンバイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
new Main().evaluate("A");
}
private void evaluate(String rank) {
switch (rank) {
case "A" -> System.out.println("Very Good");
case "B", "C" -> System.out.println("Good");
case "D", "E" -> System.out.println("Not Good");
default -> System.out.println("Unknown");
}
}
}
選択肢
A)コンパイルエラーになる
B)Very Good Good Not Good Unknown が出力される
C)Very Good が出力される
D)Very Good Unknown が出力される
E)Very Good Good Good Not Good Not Good Unknown が出力される
解答
A)コンパイルエラーになる
B)Very Good Good Not Good Unknown が出力される
C)Very Good が出力される
D)Very Good Unknown が出力される
E)Very Good Good Good Not Good Not Good Unknown が出力される
解説
「->」を使用するとbreakと同じ意味で、一致するcaseの処理のみ実行されます。
そのため、switchでAに該当するVery Goodのみが出力されます。
実行の流れ
- メインメソッド:
- プログラムが開始され、
main
メソッドが実行されます。 new Main().evaluate("A");
によってMain
クラスのインスタンスが生成され、そのevaluate
メソッドが呼ばれます。引数には"A"
が渡されます。
- プログラムが開始され、
- evaluateメソッド:
- 引数
rank
に"A"
が渡されます。 switch
文が開始され、rank
の値が"A"
であるかどうかがチェックされます。
- 引数
- switch文の評価:
case "A" -> System.out.println("Very Good");
によって"A"
がマッチします。- この行が実行され、
System.out.println("Very Good");
により “Very Good” が出力されます。
- 他のケースの無視:
"A"
にマッチしたため、switch
文の残りのケース("B"
,"C"
,"D"
,"E"
, およびdefault
)は実行されません。- そのため、”Very Good” の出力以外は発生しません。
まとめ
- 出力: 最終的に出力されるのは “Very Good” だけです。
- コンパイルエラー: このコードは正しく記述されているため、コンパイルエラーは発生しません。
- 選択肢の確認:
- A)コンパイルエラーになる → 不正解
- B)Very Good Good Not Good Unknown が出力される → 不正解
- C)Very Good が出力される → 正解
- D)Very Good Unknown が出力される → 不正解
- E)Very Good Good Good Not Good Not Good Unknown が出力される → 不正解
このように、選択肢 C が正しい理由は、switch
文で "A"
にマッチしたため、その部分だけが実行され、他の出力は無視されるからです。
対象資格:Java SE17 認定資格