簡體   English   中英

“循環:”在 Java 代碼中。 這是什么,為什么要編譯?

[英]"loop:" in Java code. What is this, and why does it compile?

這段代碼讓我盯着屏幕看了幾分鍾:

loop:
for (;;) {
    // ...
}

此處為第 137 行

我以前從未見過這個,我不知道 Java 有一個“循環”關鍵字(NetBeans 甚至不會像關鍵字那樣給它上色),而且它在 JDK 6 中編譯得很好。

解釋是什么?

它不是keyword ,而是label

用法:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

文檔

正如其他海報所說,它是一個標簽,而不是一個關鍵詞。 使用標簽可以執行以下操作:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

這允許斷開外環。

鏈接到文檔

這個問題得到了回答,但作為旁注:

我聽說過“為什么這個 Java 代碼有效?”這樣的面試問題。 (去掉了更簡單的例子;這是更簡單的例子,感謝 Tim Büthe):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

你們都知道這個代碼是什么(除了可怕的)?

解決方案:兩個標簽, urlhttp ,一個注釋www.myserver.com/myfile.mp3和一個帶有與標簽同名 ( url ) 參數的方法調用。 是的,這會編譯(如果您在其他地方定義方法調用和局部變量)。

這不是關鍵字,而是標簽。 它旨在與嵌套循環中的breakcontinue關鍵字一起使用:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

它不是關鍵字; 這是一個標簽

它允許您標記為break和標記為continue

它是一個斷點標簽,允許您跳出指定的循環,而不僅僅是您碰巧所在的最里面的循環。

它在第 148 行使用。

這確實是對 seanizer 對 org.life.java 答案的評論的回復,但我想放入一些代碼,所以我無法使用評論功能。

雖然我發現“中斷標簽”的用途非常罕見,但它確實偶爾會發生。 最常見的情況是,當我在需要嵌套循環搜索的結構中搜索某些內容時,例如:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

通常在這種情況下,我將整個事情推入一個子程序,以便在命中時我可以返回找到的對象,如果它落在循環的底部,我可以返回 null 以指示未找到,或者可能拋出異常。 但這偶爾有用。

坦率地說,我認為 Java 的發明者包含此功能是因為在此功能和異常處理之間,他們消除了 GOTO 的最后兩個合法用途。

很晚的附錄:

我曾經看到過一段很棒的代碼。 程序員寫道:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

他實際上並沒有說“example.com”,而是我們公司的網站。

它給人的印象是代碼中有一個 URL。 它編譯成功,就像它在做某事一樣。 但是……它有什么作用?

實際上它什么都不做。 “http:”是他從不引用的標簽。 然后“//”使該行的其余部分成為注釋。

這是一個標簽,但請看以下示例:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

b>10 ,執行流程轉到外循環。

你幾乎可以寫任何東西,因為它是一個標簽......你有一個例子here

它是一個標簽,Java 中的標簽可以與breakcontinue關鍵字一起使用,以對循環進行額外控制。

這里以一種相當好的方式解釋了它:

用 Java 思考,中斷並繼續

它不是關鍵字,而是標簽 如果在for循環中你寫了break loop; ,然后退出該循環。

它是一個標簽。 通常是 Java 中用於在所需位置傳輸控制流的標簽,而所有關鍵字(如 continue 和 break)都有指定的位置選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM