goto
編程語言中一開始就有goto關鍵詞了。事實上,goto起源於彙編語言的進程控制:“若條件A成立,則調到這裏;否則跳到那裏”。
goto語句時在源碼級別上的跳轉,這導致了其不好的名譽。於是goto開始保留使用。
儘管goto仍然是Java中的一個保留字,但在語句中並未使用它:Java沒有goto。然而Java也能完成一些類似跳轉的操作,這與break和continue這兩個關鍵詞有關。它們起始不是一個跳轉,而是中斷迭代語句的一種方法。之所以把它們納入goto問題中一起討論,是由於它們使用了相同的機制:標籤。
標籤是後面跟有冒號的標識符,就像下面這樣:
label1:
在Java中,標籤其作用的唯一的地方剛好是在迭代語句之前。“剛好之前”的意思表明,在標籤和迭代之間置入任何語句都不好。而在迭代之前設置標籤的唯一理由是:我們希望在其中嵌套另一個迭代或者一個開關。這是由於break和continue關鍵字通常只能中斷當前循環,但若索通標籤一起使用,它們就會中斷循環,知道標籤所在的地方。
label1:
outer-ieration {
inner-iteration{
//...
break; //(1)
//...
continue;//(2)
//...
continue label1;//(3)
//...
break label1; //(4)
}
}
在(1)中,break中斷內部迭代,回到外部迭代。在(2)中,continue使執行點移回內部迭代的起始處。在(3)中,continue label1同時中斷內部迭代以及外部迭代,直接轉到label1處;隨後它實際上時繼續迭代過程,但卻從外部迭代開始。在(4)中,break label1也會中斷所有迭代,並回到label1處,但並不重新進入迭代。也就是説,它實際上是完全終止了兩個迭代
public static void main(String[] args){
int i = 0;
outer: //這裏不能有任何語句
for (;true;){
inner: //這裏不能有任何語句
for (; i < 10; i++){
System.out.println("i = " + i);
if(i == 2) {
System.out.println("continue");
continue;
}
if(i == 3) {
System.out.println("break");
i++;
break;
}
if(i == 7) {
System.out.println("continue outer");
i++;
continue outer;
}
if(i == 8){
System.out.println("break outer");
break outer;
}
for(int k = 0; k < 5; k++){
if(k == 3){
System.out.println("continue inner");
continue inner;
}
}
}
}
}
輸出信息:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
注意,break會中斷for循環,而且在抵達for循環的末尾之前,遞增表達式不會執行。由於break跳過了遞增表達式,所以在i==3的情況下直接對i執行遞增操作。在i==7的情況下,continue outer語句會調到循環頂部,而且也會跳過遞增,所以這裏也對i進行遞增。
如果沒有break outer語句,就沒辦法從內部循環裏跳出外部循環。這是由於break本身只能中斷最內層的循環(continue亦是如此)
當然,如果想在中斷循環的同時推出,簡單地使用一個return即可。
public static void main(String[] args){
int i = 0;
outer:
while(true){
System.out.println("Outer while loop");
while(true){
i++;
System.out.println("i = " + i);
if(i == 1) {
System.out.println("continue");
continue;
}
if(i == 3) {
System.out.println("continue outer");
continue outer;
}
if(i == 5){
System.out.println("break");
break;
}
if(i == 7){
System.out.println("break outer");
break outer;
}
}
}
}
輸出信息:
Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer
同樣的規則亦適用於while:
1、一般的continue會退回最內層循環的開頭,並繼續執行
2、帶標籤的continue會到達標籤的位置,並重新進入緊接在那個標籤後面的循環
3、一般的break會中斷並跳出當前循環
4、帶比起噢愛按的break會中斷並跳出標籤所指的循環
要注意的要點是:在Java裏需要使用標籤的唯一理由就是因為有循環嵌套存在,而且想從多層嵌套中break或continue。
from: https://hk.saowen.com/a/f30ac1fd93e9a345e31bfe064ceda916f56180221412b0786b7f5467df6af367