2013-04-13 73 views
3

在Java文檔中,我正在閱讀: finally塊在try塊退出時總是執行。這可確保即使發生意外異常也能執行finally塊。但是最後對於不僅僅是異常處理而言非常有用 - 它允許程序員避免由於返回,繼續或中斷而意外繞過清理代碼。在Java中使用break/continue退出try塊

什麼時候你會退出一個嘗試中斷或繼續?我能想到的唯一場景是你正在try塊中運行一個循環,並且使用break/continue退出,但應該退出循環之外而不是try塊本身?

回答

4

什麼時候你會退出一個嘗試塊休息或繼續?

當你有一個try循環;例如

for (Cat cat : cattery) { 
    try { 
      cat.removeFromCage(); 
      cat.healthCheck(); 
      if (cat.isPedigree()) { 
       continue; 
      } 
      cat.spey(); 
    } finally { 
      cat.putBackInCage(); 
    } 
} 

好吧...所以有更優雅的方式來寫「代碼」......但它只是一個例子。

我能想到的唯一場景是你正在try塊內運行一個循環,並且你使用break/continue退出,但是應該退出循環之外而不是try塊本身?

這是正確的。


FWIW,任何一段代碼,涉及打破了一個try塊或從抓回來或者最終或任何其他的「邊緣案」的事情可能應該簡化。 JLS明確指出在這些情況下會發生什麼......但這並不意味着您應該在真正的程序中使用它們。

2

對於一個完全人爲的例子:

import java.io.*; 

public class Foo { 
    public static void main(String[] args) throws IOException { 
     for (int i = 0; i < 10; i++) { 
      File file = new File("file-" + i); 
      FileWriter out = null; 
      try { 
       out = new FileWriter(file); 
       if (file.exists()) return; 
       out.write("Number " + i); 
       if (i % 2 == 0) continue; 
       else if (i % 3 == 0) break; 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } finally { 
       out.close(); 
      } 
     } 
    } 
} 

這是完全自然的,你可能想返回,休息一下,或繼續(或拋出異常)一試內。在這個例子中,如果finally不能保證執行,你會有資源泄漏。

是的,這個問題可以通過try-with-resource in JDK7來解決。

1

是,break/continue只會影響循環,而不是try/catch/finally塊。該文檔只是指出,在嘗試處理異常時,意外錯過(不執行)一塊清理代碼很容易,特別是那些改變流程的鬼鬼祟祟的break s和continue

finally block should always be executed,除非System.exit()被調用或JVM崩潰!

3

Java有標籤。標籤通常與中斷和繼續運營商一起使用。所以,代碼:

outer: for (int i=0; i < 1; i++){ 
    for (int j = 0; j < 1; j++) { 
    System.out.println("j:"+j); 
    continue outer; 
    } 
    System.out.println("i:"+i); 
} 

只打印「記者:0」

而且由於突破,並繼續被「標記」,可以用「嘗試」循環塊內聲明,而且塊內,你可以嘗試調用「continue」或「break outer_loop」。但是「最後」聲明阻止了這種退出,正如您在引文中所描述的那樣。

+0

你的意思是'finally'的存在可以防止通過內部try/catch觸發循環嗎? –

+1

@AquariusPower,我的意思是,代碼鏈接:http://pastebin.com/M76QKXNf 將打印這兩個打印。 所以我已經顯示break/continue語句可以實現到任何一個塊,不僅可以阻止哪個是「父」到「嘗試」塊。 換句話說,問題的作者並不知道break&continue可以有一個「參數」。 –

0

是可能的,使用break語句我們可以退出try塊標籤的幫助,而無需使用循環

tryLabel: 
     try { 
      if(true) 
       break tryLabel; 
      System.out.println("try"); 
     }catch(Exception e) { 
      System.out.println("catch"); 
      e.printStackTrace(); 
     }finally{ 
      System.out.println("finally"); 
     }