switch-case 是 Java 流程控制的核心語句,但其「貫穿」特性與型別限制常成為考試與面試的高頻考點,也是新手易犯錯的地方。本文從底層原理出發,系統梳理語法規則、執行流程、支援型別演進歷程,並透過 4 個經典易混淆範例,幫助讀者徹底攻克這個「心病」。
switch (表達式) {
case 常量表達式1: 語句1; break;
case 常量表達式2: 語句2; break;
...
default: 語句; break; // 可選,無匹配 case 時執行
}
break 或 switch 結束為界int、byte、short、char(及其包裝類別);Java 7+ 新增 String;Java 12+ 引入 switch 表達式(箭頭語法)與模式匹配(預覽)int i = 3;
switch (i) {
case 1: System.out.println(1); break;
case 2: System.out.println(2); break;
case 3: System.out.println(3); break;
default: System.out.println("default"); break;
}
// 輸出:3
匹配 case 3 → 執行 println(3) → 遇 break 跳出 → 結束。
int i = 2;
switch (i) {
case 1: System.out.println(1);
case 2: System.out.println(2);
case 3: System.out.println(3);
default: System.out.println("default");
}
// 輸出:
// 2
// 3
// default
匹配 case 2 → 執行 2、3、default 全部語句 → 無 break 阻隔 → 全部輸出。這是最常見的 Bug 來源。
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
case 'C': System.out.println("及格"); break;
case 'D':
case 'F': System.out.println("不及格"); break;
default: System.out.println("無效等級");
}
// 輸出:及格
case 'A'、'B'、'C' 無語句直接貫穿至 println("及格"),優雅實現區間判斷。
int x = 5;
switch (x) {
default: System.out.println("default first");
case 1: System.out.println(1); break;
case 5: System.out.println(5); break;
}
// 輸出:
// 5
// (default 不執行,因 case 5 有 break 阻隔)
default 可放在任意位置,僅在無 case 匹配時才會被「落入」執行;若有 case 匹配且後續有 break,default 會被跳過。
| 版本 | 支援型別 | 新特性 |
|---|---|---|
| Java 1.0 - 6 | int, byte, short, char + 包裝類 | 傳統 switch 陳述式 |
| Java 7 | + String | 字串匹配(內部用 hashCode + equals) |
| Java 12 (預覽) / 14 (標準) | 同上 | Switch 表達式:-> 箭頭語法、無貫穿、可回傳值 |
| Java 17+ | + 模式匹配 (預覽) | case Integer i -> ... 型別匹配與解構 |
String result = switch (day) {
case "MON", "TUE", "WED", "THU", "FRI" -> "工作日";
case "SAT", "SUN" -> "週末";
default -> "無效日期";
};
優點:無貫穿風險、可作為表達式賦值、編譯器強制要求覆蓋所有情況(exhaustiveness)。
Map<K, Runnable> 或多態設計獲得更好維護性// fall through)switch-case 的核心在於理解「匹配後順序執行直到 break」的貫穿機制。掌握四大鐵律、熟練識別漏寫 break 與善用貫穿的場景,並隨著 Java 版本升級採用更安全的 Switch 表達式,即可徹底解決這個困擾許多開發者的「弱項」。建議在舊專案維護時留意傳統寫法陷阱,新專案優先使用 Java 12+ 箭頭語法。