1. 程式人生 > 其它 >Java 跳出多重巢狀語句

Java 跳出多重巢狀語句

Java 跳出多重巢狀語句

儘管 Java 的設計者將 goto 作為保留字,但實際上並沒有打算在語言中使用它。

——Java核心技術 卷1(原書第11版)

Java提供了一種帶標籤的 break 語句,使用它可以跳出多重巢狀迴圈,就像下面這樣:

public static void main(String[] args) {
    int x = 1;
    start:
    while(x < 100) {
        int y = 1;
        while(y < 100) {
            for(int z = 1; z < 100; ++z) {
                if(x == 11) break start;
                if(x == y && y ==z) {
                    System.out.println("x=y=z=" + x);
                }
            }
            ++y;
        }
        ++x;
    }
}

輸出結果如下:

x=y=z=1
x=y=z=2
x=y=z=3
x=y=z=4
x=y=z=5
x=y=z=6
x=y=z=7
x=y=z=8
x=y=z=9
x=y=z=10

Process finished with exit code 0


還有一種帶標籤的continue語句,它將跳轉到與標籤匹配的迴圈的首部,寫一個測試用例看看效果:

public static void main(String[] args) {
    start:
    for(int i = 0; i< 18; ++i) {
        for(int j = 0; j < 18; ++j) {
            for(int k = 0; k < 18; ++k) {
                if(i == 11) continue start;
                if(i == j && j == k) System.out.println("i=j=k=" + i);
            }
        }
    }
}

輸出結果如下:

i=j=k=0
i=j=k=1
i=j=k=2
i=j=k=3
i=j=k=4
i=j=k=5
i=j=k=6
i=j=k=7
i=j=k=8
i=j=k=9
i=j=k=10
i=j=k=12
i=j=k=13
i=j=k=14
i=j=k=15
i=j=k=16
i=j=k=17

Process finished with exit code 0

可以看到輸出跳過了i=j=k=11


Curiously, you can apply a label to any statement, even an if statement or a block statement.

——Java核心技術 卷1:基礎知識. 上(第11版·英文版)

嘗試將標籤應用到 if 語句,看看有什麼效果:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int x = scanner.nextInt();
    start:
    if(x > 0) {
        System.out.println("x > 0, block executed start...");
        int y = scanner.nextInt();
        if(y > 0) {
            System.out.println("y > 0, block executed start...");
            int z = scanner.nextInt();
            if(z > 0) {
                System.out.println("z > 0, block executed start...");
                System.out.println("z > 0, block executed end");
            }else {
                break start;
            }
            System.out.println("y > 0, block executed end");
        }
        System.out.println("x > 0, block executed end");
    }
}

下面是兩種不同的輸入得到的不同的結果:

  • 第一種

    1
    x > 0, block executed start...
    1
    y > 0, block executed start...
    1
    z > 0, block executed start...
    z > 0, block executed end
    y > 0, block executed end
    x > 0, block executed end

    Process finished with exit code 0

  • 第二種

    1
    x > 0, block executed start...
    1
    y > 0, block executed start...
    -1

    Process finished with exit code 0


帶標籤的 continue 語句只能應用在迴圈語句中,而帶標籤的 break 語句則可以應用在各種複合語句中。

有一點非常明顯,無論是帶標籤的continue語句,還是帶標籤的break語句,都只適合在多層巢狀語句的內層使用。對於單層迴圈來說,使用帶標籤的continue或者break是不必要的,它們和純粹的continue語句或break語句效果一樣。


參考資料:

[1] Cay S.Horstmann 著,林琪 蘇鈺涵等譯.Java核心技術 卷1(原書第11版).北京:機械工業出版社,2020:74-76.

[2] Cay S.Horstmann.Java核心技術 卷1:基礎知識 上(第11版·英文版).北京:人民郵電出版社,2019:103.