2015-02-07 40 views
2

我在java代碼中的標籤中使用break語句時出現錯誤。這顯示undefined label。編寫這樣的代碼是錯誤的。請幫助我正確使用它。提前致謝。如何在java代碼中使用標籤?

while (true) 
      { 
      label149: if (!localIterator2.hasNext()); 
      while (true) 
      { 
       i++; 
       break; 
       HashMap localHashMap2 = (HashMap)localIterator2.next(); 
       if (!((String)localHashMap1.get("name")).equalsIgnoreCase((String)localHashMap2.get("emotion"))) 
       break label149; 
       if (!((String)localHashMap2.get("IS_paid")).equalsIgnoreCase("1")) 
       break label246; 
       ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "1"); 
      } 
      label246: ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "0"); 
      } 
+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html – assylias 2015-02-07 10:49:58

+0

呃,你有第一個分號後的第一個分號... – fge 2015-02-07 10:50:00

+1

基本上,它們不是太可怕,太可怕了,可怕的方式來編程和偉大的指標很糟糕的設計 – MadProgrammer 2015-02-07 10:53:21

回答

4

帶標籤的breakgoto聲明不同。 Java沒有goto聲明。

一個標籤標誌着它後面的語句。你可以用它來打破這個陳述,而且只能用這個陳述。流量控制將始終轉移到標記語句的末尾。

那麼你在這裏有什麼?

 label149: if (!localIterator2.hasNext()); 

因爲分號如果經過,其實這是整個標籤的語句。所以你的break label149根本不在其範圍之內。如果您沒有該分號,則if塊將包含while,然後break label149將起作用。但是在while區塊結束後,控制權將轉移到該行。

 label246: ((HashMap)Saved.this.keynamedata.get(i)).put("is_paid", "0"); 

這是由label246標記的語句。再次,break label246不在裏面,所以它不在它的範圍內,你不能擺脫你不在其中的聲明。

+0

好吧,Java _did_保留'goto'關鍵字...只是它沒有做什麼。 – fge 2015-02-07 11:39:55

3

隨着中斷和繼續,你可以在你的應用程序中有複雜循環的地方使用標籤。但是總是建議避免使用標籤,因爲它很難讀取代碼並完全類似於糟糕的設計(請記住其他語言中的goto(仍然是關鍵字))。標籤的例子會是這樣的:

abc: for (;;) { 
    for (;; i++) { 
     if (i == 255) { 
      break abc; 
     } 
    } 
} 
System.out.println("Noww i am back"); 

這就是說,我需要打破我已經標記爲abc的循環。所以它會出來循環。如果我在那裏省略了abc,那麼它會從最內層的循環中出來,也就是我說它從中斷的第二個循環。你不能期望標籤在代碼中的任何地方。

相關問題