public class SwitchDemo {
public static void main(String[] args) {
System.out.println("2 = " + numCase(2));
}
public static String numCase(int n) {
String chineseNumber = "";
switch (n) {
case 0: chineseNumber = "零";
case 1: chineseNumber = "壹";
case 2: chineseNumber = "貳";
case 3: chineseNumber = "三";
case 4: chineseNumber = "肆";
case 5: chineseNumber = "伍";
case 6: chineseNumber = "陸";
case 7: chineseNumber = "柒";
case 8: chineseNumber = "捌";
case 9: chineseNumber = "玖";
}
return chineseNumber;
}
}
2 = 玖
Java switch 默認順序執行,匹配到 case 2 後,依續執行 case 3~9 所有賦值語句,最終 chineseNumber 為最後一條 "玖"。這稱為 Fall-through(穿透)。
switch (n) {
case 0: chineseNumber = "零"; break;
case 1: chineseNumber = "壹"; break;
case 2: chineseNumber = "貳"; break;
case 3: chineseNumber = "三"; break;
case 4: chineseNumber = "肆"; break;
case 5: chineseNumber = "伍"; break;
case 6: chineseNumber = "陸"; break;
case 7: chineseNumber = "柒"; break;
case 8: chineseNumber = "捌"; break;
case 9: chineseNumber = "玖"; break;
default: chineseNumber = "未知"; break;
}
// 合法場景:多值共用邏輯
switch (month) {
case 3: case 4: case 5: season = "春季"; break;
case 6: case 7: case 8: season = "夏季"; break;
case 9: case 10: case 11: season = "秋季"; break;
default: season = "冬季";
}
最佳實踐:故意穿透處必須加註釋 // fall through,並通過 Checkstyle/SpotBugs 強制檢查。
Window → Preferences → Java → Compiler → Errors/WarningsPotential programming problems‘switch’ case fall-through 設為 Error(紅叉)或 Warning(黃線)break 直接報錯Settings → Editor → Inspections → Java → Control flow issuesFallthrough in 'switch' statement → Severity 選 Errorbreak預設即啟用 switch.fallthrough 警告,settings.json 可調整:
"java.compile.nullAnalysis.mode": "automatic",
"java.lint.switchFallthrough": "error"
// 箭頭語法:無穿透、賦值表達式、編譯期保證窮盡
String chineseNumber = switch (n) {
case 0 -> "零";
case 1 -> "壹";
case 2 -> "貳";
case 3 -> "三";
case 4 -> "肆";
case 5 -> "伍";
case 6 -> "陸";
case 7 -> "柒";
case 8 -> "捌";
case 9 -> "玖";
default -> "未知";
};
優勢:語法層面消除穿透風險、函數式風格、類型安全、編譯器強制覆蓋所有情況。
switch 默認穿透是歷史設計,每個 case 必須以 break/return/throw 結束