《Java 7程序设计入门经典》一3.14 像使用goto语句一样使用break语句
3.14 像使用goto語句一樣使用break語句
除了用于switch語句和循環外,break語句也可以用提供像goto語句一樣的用法。由于goto語句是一種改變程序流的非結構化方法,因此Java并沒有goto語句。使用了很多goto語句的程序一般難以理解和維護。但是,有一些使用goto語句的地方是有用且合理的。例如,在退出一組嵌套很深的循環時就是這樣。為了應對這種情況,Java定義了break語句的擴展形式。例如,通過使用這種形式的break語句,可以從多層代碼塊退出。這些代碼塊不必是循環或是switch的一部分。它們可以是任意的代碼塊。另外,還可以精確指定執行恢復的位置,因為break的這種形式使用了標簽。break語句具有goto語句的優點,還避免了goto語句的一些問題。
這種有標簽的break語句的一般形式如下:
這里,label是標簽名,標識一句代碼或一個代碼塊。當這種形式的break語句執行時,控制權從標記的語句或塊中轉移出。標記的語句或塊必須包含break語句,但是它不一定是最近的語句或塊。例如,這意味著,可以用有標簽的break語句退出一系列嵌套代碼塊。但不能使用break語句將程序控制權轉移到不含break語句的塊中。
為了給語句和塊起個名字,可以在其開始處加標簽。標簽(label)是后加冒號的任意有效Java標識符。一旦為語句和塊加了標簽,就可以將這個標簽作為break語句的目標。這樣做可以執行語句或塊后的語句。例如,下面的程序有三個嵌套的循環。
程序的輸出如下所示:
讓我們仔細看看這個程序,以理解為什么生成這樣的輸出。當i為1時,第一個if語句成功,使break跳轉到由標簽one定義的代碼塊的末尾。這使得程序輸出“After block one”。當i為2時,第二個if語句成功,使控制權轉移到由標簽two標注的塊的末尾。這使程序順序輸出“After block two”和“After block one”。當i為3時,第三個if語句成功,控制權轉移到標記為three的語句的末尾。這時,三條消息都顯示。
再看一個例子。這個例子使用break語句從一系列嵌套的for循環中跳出。當內層運行的break語句執行時,程序控制權跳轉到外層for循環定義的塊的末尾,這個塊標記為done。這使得三重循環的剩余部分不再執行。
程序輸出如下所示:
在何處精確放置標簽十分重要,特別是當涉及循環時。例如,考慮下面的程序:
程序輸出如下所示:
在程序中,兩個嵌套的循環只有一點不同。在第一個嵌套循環中,標簽在外層for語句的前面。在這種情況下,當執行break語句時,將控制權轉移到整個for塊的末尾,跳過外層循環迭代的其他代碼。在第二個嵌套循環中,標簽在外層for語句的左花括號前。于是,當執行break stop2時,控制權轉移到外層for語句塊的末尾,而不是循環的末尾。這引起下一次迭代的發生。
注意,不能跳轉到不是為包括break語句的語句或塊定義的標簽。例如,下面程序是無效的,不能編譯。
因為標注為one的for循環不包括在第二個for循環中的break語句,所以不可能將控制權轉移到那個標簽。
總結
以上是生活随笔為你收集整理的《Java 7程序设计入门经典》一3.14 像使用goto语句一样使用break语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java 7程序设计入门经典》一3.7
- 下一篇: Java中String类型的数据比较