2013-10-23 25 views
2

總之,爲什麼這是允許的?爲什麼Java允許您打破當前行?

label1: while (condition) 
label2:  if (condition) 
label3:   break label3; 

我能理解標註的while這樣你就可以提前結束,或if這樣你就可以打破一個if而不是另一個,但爲什麼break?您何時需要break出於目前的break

經過測試,我發現label3: break label3;運行,但什麼都沒做,繼續下一行。 這有什麼功能?

另請注意,Java不會讓您打破所有語句。例如,label: Object o = new Object();會給出編譯器錯誤,指出它不是一個聲明,並且預計會出現;,儘管它確實運行了Object的構造方法(並且,正如我們在Why does Java allow for labeled breaks on arbitrary statements?中看到的,Java允許您標記方法調用; label: new Object();編譯正好)。

+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.7 – kosa

+0

簡單的語言定義?在語言層面禁止它會更加複雜;但允許它看起來相當無害。另一種方法是在代碼分析期間標記它。 –

回答

2

Q1:爲什麼Java允許這樣做?

與所有的語言設計問題,得到一個明確的答案的唯一方法是要求設計師

但是在這種情況下,這是一個無用的,但無害的邊緣情況下一個有用的構造。由於它沒有真正的傷害,所以幾乎沒有必要禁止它。

事實上,在不允許有它會有傷害。即刪除此(無害)邊將情況A語言限制:

  • 使它更難誰是構建產生 Java代碼的工具鄉親,

  • 是寫一羣人額外的工作java規範和

  • 對於構建Java編譯器的人羣來說是額外的工作。


Q2:目的是什麼?

它沒有目的本身。聲明label: break label;沒有任何用處。但是,這很好,還有很多編寫Java程序的其他方法,它們不會做任何有用的事情;例如if (true) { }

0

break語句由談到JLS, Section 14.15

沒有標籤的break語句試圖控制轉移到 最內層的開關,同時,這樣做,或爲 立即封閉方法的聲明或初始化程序;此聲明,即 稱爲中斷目標,然後立即正常完成。

準確地說,沒有標籤的break語句總是突然完成 ,原因是沒有標籤的中斷。

如果在方法,構造函數或初始值設定項的方法,構造函數或初始值設定項中沒有開關,while,do或for語句,則會發生編譯時錯誤 。

帶有標籤標識符的break語句嘗試將控件 轉換爲封閉標籤語句(第14.7節),該標籤語句具有與標籤相同的 標識符;這個聲明,這被稱爲中斷 目標,然後立即正常完成。在這種情況下,中斷 目標不需要是switch,while,do或for語句。

準確地說,標籤標識符始終爲 的break語句突然完成,原因是標籤標識符中斷。

break語句必須引用包含方法,構造函數或初始值設定項的緊鄰 中的標籤。沒有非本地跳轉 。如果 立即封閉的方法,構造函數或初始值設定項中沒有帶標識符的帶標籤的語句作爲它的標籤包含 break語句,則會發生編譯時錯誤。

沒有什麼說明break中斷的標籤不能標記爲當前塊內的某個標籤。你總是可以說break;突破最內層的塊。

而且break沒有打出去的if的 - 它必須是一個switchwhiledo,或for,按照上面的JLS。

label: Object o = new Object();不起作用的原因是因爲Object o = new Object();不是一個聲明 - 這是一個聲明。 JLS, Section 14.7談到:

標識符被聲明爲立即包含的語句的標籤。

+1

*「break並沒有突破if,它必須是'switch','while','do'或'for',根據上面的JLS。」* - **那不是什麼它說的!**它實際上說的是,沒有標籤的'break' *必須位於'switch','while','do'或'for'和一個帶有標籤的'break' * *沒有這個限制。 –