| 關鍵字 | 作用 | 適用範圍 | 典型場景 |
|---|---|---|---|
break | 立即終止最近的循環或 switch | for/while/do-while/switch | 找到目標提前退出、異常保護 |
continue | 跳過本次迭代剩餘代碼,直接進入下一次循環判斷 | for/while/do-while | 過濾不符合條件的元素、錯誤恢復 |
// 源碼
for (int i=0; i<10; i++) {
if (i==5) break;
if (i%2==0) continue;
System.out.println(i);
}
// 關鍵字節碼指令
// break → goto 跳轉到循環結束標籤
// continue → goto 跳轉到循環增量/條件檢查標籤 (for) 或條件檢查標籤 (while)
JVM 無專門的 break/continue 指令,均由 goto 實現跳轉。編譯器根據上下文生成正確的目標地址。
outer: for (int i=0; i<3; i++) {
inner: for (int j=0; j<3; j++) {
if (i==1 && j==1) break outer; // 直接跳出外層
if (j==2) continue outer; // 直接進入外層下一次迭代
System.out.println(i+","+j);
}
}
// 輸出: 0,0 0,1 1,0 2,0 2,1
最佳實踐:標籤名語義化 (如 rowLoop:、retryLoop:),避免濫用導致面條代碼。
// for 循環:continue → 執行增量表達式 → 條件判斷
for (int i=0; i<5; i++) {
if (i==2) continue;
System.out.print(i); // 輸出: 0 1 3 4
}
// while 循環:continue → 直接跳到條件判斷,不執行循環體後續遞增!
int i=0;
while (i<5) {
if (i==2) { i++; continue; } // 必須手動遞增,否則死循環
System.out.print(i);
i++;
}
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
if (j==1) break; // 只跳出內層 j 循環
}
// 這裡會繼續執行 i=0,1,2
}
switch (2) {
case 1: System.out.print("1");
case 2: System.out.print("2"); // 無 break,貫穿執行
case 3: System.out.print("3");
}
// 輸出: 23
try {
for (int i=0; i<3; i++) {
if (i==1) break; // break 前會執行 finally
}
} finally {
System.out.println("finally 執行"); // 總會執行
}
public class BreakContinueDemo {
public void testBreak() {
for (int i=0; i<10; i++) if (i==5) break;
}
public void testContinue() {
for (int i=0; i<10; i++) if (i%2==0) continue;
}
}
// javap -c BreakContinueDemo.class 觀察 goto 偏移量
break = 循環/開關的「急剎車」,continue = 當前迭代的「快轉鍵」while 中 continue 不自動執行遞增邏輯,極易導致死循環finally 區塊在 break/continue/return 前**總會執行**