| 關鍵字 | 作用範圍 | 執行流程 | 典型場景 |
|---|---|---|---|
| break | switch / 循環 (for/while/do-while) | 立即跳出整個塊,繼續執行塊後代碼 | 找到目標提前結束、switch 分支結束 |
| continue | 僅限循環 | 跳過本次迴圈剩餘代碼,直接進入下一次迭代判斷 | 過濾特定條件、異常處理後繼續 |
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
System.out.println("i = " + i);
}
// 輸出: 1, 2
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
System.out.println("i = " + i);
}
// 輸出: 1, 2, 4, 5
int day = 3;
switch (day) {
case 1: System.out.println("週一"); break;
case 2: System.out.println("週二"); break;
case 3: System.out.println("週三"); break; // 無 break 會貫穿執行 case 4
case 4: System.out.println("週四");
default: System.out.println("其他");
}
// 輸出: 週三
Java 支援標籤,實現多層循環的精確控制。
outer: for (int i = 1; i <= 3; i++) {
inner: for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
System.out.println("觸發 break outer");
break outer; // 直接跳出外層循環
}
System.out.printf("i=%d, j=%d%n", i, j);
}
}
// 輸出:
// i=1, j=1
// i=1, j=2
// i=1, j=3
// i=2, j=1
// 觸發 break outer
outer: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
System.out.println("觸發 continue outer, i=" + i);
continue outer; // 跳過內層剩餘,外層進入下一輪
}
System.out.printf("i=%d, j=%d%n", i, j);
}
}
// 輸出:
// i=1, j=1
// 觸發 continue outer, i=1
// i=2, j=1
// 觸發 continue outer, i=2
// i=3, j=1
// 觸發 continue outer, i=3
// 不推薦:索引循環易出界、需手動 break/continue
for (int i = 0; i < list.size(); i++) {
if (shouldSkip(list.get(i))) continue;
process(list.get(i));
}
// 推薦:增強 for / 迭代器 / Stream
for (Item item : list) {
if (shouldSkip(item)) continue;
process(item);
}
// 或 Stream 過濾
list.stream()
.filter(this::shouldProcess)
.forEach(this::process);
// 避免深層 if-else
void process(User user) {
if (user == null) return; // 守衛條款
if (!user.isActive()) return; // 守衛條款
if (user.getBalance() < 0) return; // 守衛條款
// 核心業務邏輯平鋪
doBusiness(user);
}
for (int i = 0; i < 5; i++) {
if (i == 2) continue;
System.out.println(i);
}
// i 依然會遞增到 3, 4...
break 是「終止」,continue 是「跳過」。善用守衛條款、Stream API、方法提取可消除 90% 的顯式跳轉需求。標籤是核武器,慎用、慎用、再慎用。