2017-04-20 49 views
2

跟在try-with-resources之後的catch是否覆蓋初始化部分還不清楚。try-with-resources中的捕獲是否覆蓋括號中的代碼?

換句話說,考慮下面的代碼段:

try (InputStream in = getSomeStream()) { 
     System.out.println(in.read()); 
    } catch (IOException e) { 
     System.err.println("IOException: " + e.getMessage()); 
    } 

我會被catch如果IOException拋出getSomeStream()調用?

還是catch只覆蓋大括號內的塊,即System.out.println(in.read())

+1

摘自:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html 「一次嘗試與資源語句可以有漁獲物和finally塊就像一個普通的try語句。在try-with-resources語句中,任何catch或finally塊都在聲明的資源關閉後運行。「 這意味着您的catch-block將照常進行處理。之後您只需要關心資源將被關閉,因爲在達到捕獲前會發生這種情況。 – DiabolicWords

+1

@DiabolicWords我錯過了什麼嗎?該段中是否有答案回答這個問題? – Michael

回答

2

JLS,你的例子是一個擴展的試用資源。

帶有至少一個catch子句和/或 finally子句的try-with-resources語句被稱爲擴展try-with-resources語句。

在這種情況下:

翻譯的作用是把資源規範 「內部」 try語句。 這使得擴展 嘗試 - 與資源語句的catch子句捕捉異常,由於 自動初始化或關閉任何資源。

所以是的,這個例外將會被你的catch塊所捕獲。

1

是的,它被覆蓋。運行

try (InputStream in = getSomeStream()) { 
    System.out.println(in.read()); 
} catch (IOException e) { 
    System.err.println("IOException: " + e.getMessage()); 
} 

static InputStream getSomeStream() throws IOException { 
    throw new IOException(); 
} 

打印

IOException異常:空

所以,是的,在初始化部分拋出的異常是夾在catch塊。