Java中的goto

一、 Java中的goto關鍵字

       在C/C++中,goto常被用於跳出多重循環。但goto 語句的使用往往會使程序的可讀性降低,所以 Java 不允許 goto 跳轉。實際上,自從“goto有害論”提出後,軟件開發就不建議使用goto了,但是Java中依然保留了goto這個關鍵字留作備用,但這個關鍵字沒有任何作用,只是爲了將來可能的擴展,防止使用goto作爲程序中的標識符。
  類似地,Java中的const也只是一個不起作用的保留關鍵字(不具備C語言中定義常量的作用,Java中要想定義常量使用final關鍵字),與goto一樣防止作爲程序中的標識符。

二、Java中的標籤

       雖然Java中的goto不起作用,但Java 中同樣可以定義標籤(當然Java中標籤的設計不是爲了goto),使用標識符加冒號的形式,如“mylabel:”。
  Java 中的標籤是爲循環設計的,是爲了在多重循環中方便的使用 break 和 coutinue 而設計的。(這也是Java中唯一用到標籤的地方!)正是由於這個原因,Java 的標籤只能定義在三種循環 (for() {}, do{} while(), while() {}) 的開始位置,否則編譯器會報告說找不到標籤。
  在循環前面加上標籤,就好像給循環起了個名字。而後在循環中使用 break 或者 continue 語句的時候,就可以帶上這個標籤做爲參數,指明跳出 (break) 或者繼續 (continue)標籤對應的哪個循環,如“break mylabel;”、“continue mylabel;”。

三、示例

package check;

public class retryLearn {
    static void retryContinue() {
        System.out.println("執行retryContinue:");
        int i = 0, j = 0;
        retry:
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 5; j++) {
                System.out.println(j);
                if (j == 3) {
                    continue retry;
                }
            }
        }
        System.out.printf("after loop, i = %d, j=%d", i, j);
    }

    static void retryBreak() {
        System.out.println("執行retryBreak:");
        int i = 0, j = 0;
        retry1:
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 5; j++) {
                System.out.println(j);
                if (j == 3) break retry1;
            }

        }
        System.out.printf("after loop, i = %d, j=%d\n", i, j);
    }

    static void whileLabel() {
        System.out.println("執行whileLabel:");
        int i = 0;
        int j = 0;
        whileLabel:
        while (i++ < 10) {
            while (j < 10) {
                System.out.println(j);
                if (j == 6) break whileLabel;
                ++j;
            }
        }
        System.out.printf("after loop, i = %d, j=%d\n", i, j);
    }

    public static void main(String[] args) {
        retryContinue();
        System.out.println("***********************");
        retryBreak();
        System.out.println("***********************");
        whileLabel();
    }
}

break/continue+標籤都是緊跟在循環的前面使用,以retryBreak函數舉例,當第二層for循環中j的值是3的時候,執行”break retry1"語句,而retry1這個標籤標記的是第一層循環,也就是說對最外層循環執行break,所以當在i的值爲0,j的值爲3的時候跳轉兩層嵌套的for循環!

四、應用

雖然break/continue+標籤的用法平時很少見到,但在Java的源碼中不時會看到,如在ThreadPoolExecutor類中的addWorker方法就使用了"continue 標籤"。因此這也是Java程序設計的一種技巧,需要加以掌握。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章