首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java switch-case 完全攻略:語法規則、落入陷阱與模式匹配新特性

     編輯:Java 相關知識

核心語法回顧

switch (表達式) {
    case 常量表達式1: 語句1; break;
    case 常量表達式2: 語句2; break;
    ...
    default: 語句;
}

四大鐵律

  1. default 非必要,無匹配 case 時執行。
  2. case 後語句區塊不需大括號(但建議加上)。
  3. 表達式型別僅支援:int、byte、short、char、String(Java 7+)、enum(Java 5+)。不支援 long、float、double、boolean。
  4. 落入特性:匹配成功後順序執行後續所有 case,直到遇到 break 或結尾。善用此特性可合併多 case 共用邏輯。

三大經典陷阱實測

陷阱 1:標準型(每個 case 都有 break)

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

陷阱 2:利用落入特性判斷月份天數


int month = 3, day;
switch (month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        day = 31; break;
    case 2:
        day = 28; break; // 簡化未考慮閏年
    case 4: case 6: case 9: case 11:
        day = 30; break;
}
// month=3 → day=31

陷阱 3:default 位置影響落入流程


int i = 1;
switch (i) {
    case 1:
        System.out.println(1);
    default:
        System.out.println("default");
    case 2:
        System.out.println(2);
        break;
    case 3:
        System.out.println(3);
        break;
}
// 輸出:
// 1
// default
// 2

解析:case 1 無 break,落入 default,再落入 case 2 遇 break 才停。default 位置不影響匹配順序,只影響落入路徑。

現代 Java 增強:Switch Expressions (Java 12/14+)

箭頭語法 → 無落入、支援回傳值


// 表達式寫法,直接賦值
String result = switch (day) {
    case 1, 2, 3, 4, 5 -> "工作日";
    case 6, 7 -> "週末";
    default -> "錯誤";
};

// 區塊寫法,需用 yield 回傳
int score = switch (grade) {
    case 'A' -> 90;
    case 'B' -> 80;
    case 'C' -> {
        int base = 70;
        yield base + 5; // 區塊中用 yield
    }
    default -> 0;
};
  • 案例標籤合併:case 1, 2, 3 取代多行 case。
  • 無落入:箭頭形式自動中斷,杜絕漏寫 break Bug。
  • 完整性檢查:enum switch 若未覆蓋所有值且無 default,編譯報錯。

模式匹配 Switch (Java 17+ Preview / 21 正式)


static String formatter(Object obj) {
    return switch (obj) {
        case Integer i -> "整數:" + i;
        case Long l    -> "長整數:" + l;
        case Double d  -> "浮點數:" + d;
        case String s  -> "字串:" + s;
        case null      -> "空值";
        default        -> obj.getClass().getSimpleName() + ":" + obj;
    };
}

威力:型別檢查、轉型、綁定變數一行搞定,告別 instanceof + 強轉樣板碼。

避坑檢查清單

常見錯誤正確做法
case 使用變數而非常量case 後必須是編譯期常量(final 變數、字面值、enum)
忘記 break 導致邏輯錯誤改用 Java 12+ 箭頭語法,或加上 // fall through 註釋
String switch 傳 null 丟 NPEJava 17+ 可直接 case null;舊版先判 null
long/float/double 型別直接用轉換為 int/String/enum,或改用 if-else

總結

從傳統 switch 到現代 switch expression、pattern matching,Java 持續降低樣板碼與 Bug 率。建議:新專案直接用箭頭語法;舊代碼逐步遷移;涉及型別判斷優先考慮模式匹配。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved