轉 https://www.jianshu.com/p/7954b61bc6ee
java中 label 配合 break continue 使用的其實是比較少的.
這種做法在業務代碼中比較少見.
在讀其他庫的代碼時可能會遇到該語法的使用.
下面對該語法做簡短解釋.
break label
用來終止循環體的循環,使用break 可以終止的循環體包括三種, for,while,do-while
不帶 label使用 break 時
執行 break ,會終止離 break 關鍵字最近的循環體的循環.
示例如下
for (int i = 0; i < 3; i++) { System.out.println(String.format("start outer for loop index %d", i)); int j = 0; while (true) { System.out.println(String.format("inner loop with while index %d", j)); if (j == 2) { //終止最近的for,while,do-while循環 break; } else { j++; } } System.out.println(String.format("end outer for loop index %d", i)); }
結果為
start outer for loop index 0
inner loop with while index 0
inner loop with while index 1
inner loop with while index 2
end outer for loop index 0
start outer for loop index 1
inner loop with while index 0
inner loop with while index 1
inner loop with while index 2
end outer for loop index 1
start outer for loop index 2
inner loop with while index 0
inner loop with while index 1
inner loop with while index 2
end outer for loop index 2
通過打印可以看出,內部循環每次執行到2時就將當前 while 死循環停止.
而外部循環則會從0遍歷到2,正常循環遍歷.不受 break 的影響.
帶 label 的break
會終止指定 label 所對應的循環體.
示例為從二維的student age 數組中,找第一個年紀為9歲的學生.
int students[][] = {{10, 12, 11}, {8, 9, 1}, {9, 15, 7}}; jumpOutHere: for (int i = 0; i < 3; i++) { System.out.println(String.format("start outer for loop index %d", i)); int j = 0; while (j < 3) { System.out.println(String.format("current retrieve value %d", students[i][j])); if (students[i][j] == 9) { break jumpOutHere; } else { j++; } } System.out.println(String.format("end outer for loop index %d", i)); }
結果為
start outer for loop index 0
current retrieve value 10
current retrieve value 12
current retrieve value 11
end outer for loop index 0
start outer for loop index 1
current retrieve value 8
current retrieve value 9
當遍歷到二維數組中第一個年紀為9的學生時,直接終止 label 對應的循環.此處為外層循環.
continue label
用來跳過循環體中本次執行的循環,使用continue 可以跳過的循環體包括三種, for,while,do-while
不帶 label 的 continue
會跳過距離continue最近的循環體的本次執行,執行下一次循環
for (int i = 0; i < 3; i++) { System.out.println(String.format("start outer for loop index %d", i)); for(int k = 0;k<3;k++){ if(k==1) continue; System.out.println(String.format("inner loop index %d",k)); } System.out.println(String.format("end outer for loop index %d", i)); }
start outer for loop index 0
inner loop index 0
inner loop index 2
end outer for loop index 0
start outer for loop index 1
inner loop index 0
inner loop index 2
end outer for loop index 1
start outer for loop index 2
inner loop index 0
inner loop index 2
end outer for loop index 2
通過示例可以看出當 k=1時會跳過本次內部循環(也是離 continue 最近的循環),直接執行下一次內部循環.
帶 label 的 continue
會跳過標記為 label 的循環體中的本次循環的執行,並執行, label 標記位置的下一個循環.
CONTINU_LABLE:
for (int i = 0; i < 3; i++) { System.out.println(String.format("start outer for loop index %d", i)); for (int k = 0; k < 3; k++) { if (k == 1) continue CONTINU_LABLE; System.out.println(String.format("inner loop index %d", k)); } System.out.println(String.format("end outer for loop index %d", i)); }
start outer for loop index 0
inner loop index 0
start outer for loop index 1
inner loop index 0
start outer for loop index 2
inner loop index 0
通過結果可以看出,當 k=1時,直接就跳到CONTINU_LABLE標記的循環體的下一次循環了.