首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java Switch Case 穿透導致 Case 2 未執行?缺失 break 與循環變量未重置雙重陷阱

     編輯:程式設計疑難解答

問題代碼還原

int j = 1;
int i = Integer.parseInt(source.getProperty("起始行")) - 1;
int lastnum = getNum(source.getProperty("fileName"));
for (int k = 0; k < conditions.length; k++) {
    switch (conditions[k]) {
        case "1":
            for (; i < lastnum; i++) { /* 處理邏輯 */ }
            // 缺少 break!
        case "2":
            for (; i < lastnum; i++) { /* 處理邏輯 */ }
            // 缺少 break!
        default:
            break;
    }
}

雙重根因分析

1. Switch 穿透:缺失 break 導致連續執行

Java switch 默認會「穿透」執行後續 case,直到遇到 break 或結束。代碼中 case "1" 無 break,執行完畢直接進入 case "2"。

2. 循環變量 i 未重置:第二輪循環直接跳出

  • case "1" 的 for (; i < lastnum; i++) 結束時,i == lastnum。
  • 穿透進入 case "2" 時,同樣使用 for (; i < lastnum; i++),條件 i < lastnum 為 false,循環體零次執行。

修復方案

方案一:添加 break,並重置循環變量(推薦)

for (int k = 0; k < conditions.length; k++) {
    // 每次 switch 前重置 i 為初始值
    int currentI = Integer.parseInt(source.getProperty("起始行")) - 1;
    switch (conditions[k]) {
        case "1":
            for (; currentI < lastnum; currentI++) { /* ... */ }
            break; // 必須 break
        case "2":
            for (; currentI < lastnum; currentI++) { /* ... */ }
            break;
        default:
            break;
    }
}

方案二:提取方法,隔離作用域

private void processCondition(String condition, int startRow, int lastRow) {
    switch (condition) {
        case "1": handleType1(startRow, lastRow); break;
        case "2": handleType2(startRow, lastRow); break;
    }
}

最佳實踐建議

  • 強制 break:除非極少數故意穿透場景(需加 // fall through 註釋),每個 case 必須以 break 結尾。
  • 避免在 switch 中複用外部循環變量:改用局部變量或傳參,消除副作用。
  • 考慮多態替代 switch:策略模式、工廠模式可將條件分發轉為對象行為,更符合開閉原則。
  • 啟用編譯器警告:IDE 可配置「switch case 落空」警告,編譯期發現漏寫 break。

總結

Case 2 未執行是「缺失 break 導致穿透」與「循環變量未重置導致條件失效」共同作用的結果。修復核心:加 break、隔離變量。長遠看,重構為面向對象設計更能從根源消除此類流程控制錯誤。

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