一、 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程序設計的一種技巧,需要加以掌握。