在 Java 中處理多層嵌套循環時,若需從內層直接跳出外層循環,傳統做法是設置標誌位,代碼顯得冗餘且易出錯。Java 提供了「帶標籤的 break/continue」語法,優雅解決此問題。本文詳細講解語法規則、執行流程及實戰示例。
for、while、do-while 循環語句之前labelName: for (...) { ... }break labelName; / continue labelName;
// ✅ 合法:標籤緊跟循環
outerLoop:
for (int i = 0; i < 10; i++) { ... }
// ❌ 非法:標籤與循環中間有語句
outerLoop:
System.out.println("test"); // 編譯錯誤
for (int i = 0; i < 10; i++) { ... }
String[] arr = {"a", "b", "c"};
labelA:
for (String s : arr) {
for (String ss : arr) {
for (String sss : arr) {
System.out.print(sss); // 僅輸出 "a"
break labelA; // 直接跳出 labelA 標記的最外層循環
}
}
}
等價邏輯(非合法 Java 語法,僅示意):
for (String s : arr) {
for (String ss : arr) {
for (String sss : arr) {
System.out.print(sss);
goto labelA; // 概念上等同
}
}
}
labelA:
labelA:
for (String s : arr) {
for (String ss : arr) {
for (String sss : arr) {
System.out.print(sss); // 輸出 "aaa"
continue labelA; // 結束內兩層,直接進入 labelA 下一次迭代
}
}
}
輸出 aaa:外層循環執行 3 次,每次內層僅執行 1 次就 continue 回外層。
// break 中間層:輸出 "aaa"
for (String s : arr) {
labelA:
for (String ss : arr) {
for (String sss : arr) {
System.out.print(sss);
break labelA; // 跳出中間層,繼續外層下一次
}
}
}
// continue 中間層:輸出 "aaaaaaaaa" (3×3×3=27? 實際 9 個 a)
for (String s : arr) {
labelA:
for (String ss : arr) {
for (String sss : arr) {
System.out.print(sss);
continue labelA; // 結束內層,繼續中間層下一次
}
}
}
| 代碼 | 輸出 | 說明 |
|---|---|---|
| break 最外層 | a | 直接結束所有循環 |
| continue 最外層 | aaa | 外層 3 次,每次內層執行 1 次 |
| break 中間層 | aaa | 外層 3 次,中間層每次僅執行 1 次內層 |
| continue 中間層 | aaaaaaaaa | 外層 3 次 × 中間層 3 次 × 內層 1 次 |
outerLoop、rowLoop,避免單字母boolean 的方法,通過返回值控制外層流程if、switch、代碼塊等非循環語句帶標籤的 break/continue 是 Java 保留的結構化 goto 機制,用得當能簡化複雜循環控制流,濫用則成「面條代碼」溫床。理解其精確語義,在真正需要時果斷使用。