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

Java 循環中正確處理 continue 與 break 的邏輯控制

     編輯:程式設計綜合問答

問題場景

在遊戲主循環或事件處理中,開發者常需根據觸摸事件類型(如 TOUCH_DOWN、TOUCH_UP)執行不同邏輯。原代碼使用 if (event.type != TOUCH_UP) continue; 過濾事件,導致後續邏輯僅處理 TOUCH_UP,難以擴展處理其他事件類型。

原代碼片段

for (int i = 0; i < len; i++) {
    TouchEvent event = touchEvents.get(i);
    if (event.type != TouchEvent.TOUCH_UP) continue;
    // 僅處理 TOUCH_UP 邏輯
    world.doodle.DOODLE_Y = 3;
    // ... 其他邏輯
}

問題分析

  • continue 會跳過本次循環剩餘代碼,直接進入下一次迭代。
  • 若需根據不同事件類型分派邏輯,單一 continue 過濾方式不夠靈活。
  • 原代碼中 TOUCH_DOWN 事件被直接跳過,無法處理按下邏輯。

改進方案

方案一:使用 switch-case 分派事件(推薦)

for (int i = 0; i < len; i++) {
    TouchEvent event = touchEvents.get(i);
    switch (event.type) {
        case TouchEvent.TOUCH_DOWN:
            // 處理按下邏輯
            handleTouchDown(event);
            break;
        case TouchEvent.TOUCH_UP:
            // 處理抬起邏輯
            handleTouchUp(event);
            break;
        case TouchEvent.TOUCH_DRAGGED:
            // 處理拖拽邏輯
            handleTouchDragged(event);
            break;
        default:
            // 忽略未知事件類型
            continue;
    }
}

優點:結構清晰、易擴展、每種事件類型對應獨立處理邏輯。

方案二:提前過濾無效事件,保留核心邏輯

for (TouchEvent event : touchEvents) {
    if (event.type == TouchEvent.TOUCH_DOWN) {
        handleTouchDown(event);
    } else if (event.type == TouchEvent.TOUCH_UP) {
        handleTouchUp(event);
    }
    // 其他類型直接忽略,無需 continue
}

適用於事件類型較少、邏輯簡單的場景。

方案三:使用 break 提前結束循環(特定場景)

若處理完某關鍵事件(如暫停遊戲)後無需繼續處理後續事件:

for (TouchEvent event : touchEvents) {
    if (event.type == TouchEvent.TOUCH_UP) {
        if (OverlapTester.pointInRectangle(pauseBounds, touchPoint)) {
            Assets.clicks();
            state = GAME_PAUSED;
            break; // 直接跳出循環,不再處理其他事件
        }
    }
}

關鍵點總結

關鍵字作用適用場景
continue跳過本次迭代剩餘代碼,進入下一次循環過濾不需處理的數據項
break立即結束整個循環找到目標、發生錯誤、觸發關鍵狀態變更
return結束整個方法在方法中處理完核心邏輯後直接退出

最佳實踐建議

  • 優先使用 switch 或 if-else 明確分派事件類型,避免濫用 continue 導致邏輯隱蔽。
  • 將事件處理邏輯封裝為獨立方法(如 handleTouchDown()),提高可讀性與可測試性。
  • 對於高頻循環(如遊戲主循環),考慮使用對象池復用事件對象,減少 GC 壓力。
  • 循環體內盡量減少嵌套層級,單一職責原則適用於循環內部邏輯。

總結:針對不同觸摸事件類型,應使用 switch-case 或多條件 if-else 進行顯式分派,而非依賴單一 continue 過濾。break 應保留用於提前結束整個循環的關鍵節點。

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