2017-02-21 141 views
1

創建資源我有以下嘗試塊和fs這是一個關閉是以前創建的。嘗試資源不在嘗試塊

它會關閉嗎?還是我們需要明確地關閉它在終端?

try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) { 
... 
} 
+0

fs究竟是什麼?之後在** try-with-resources括號內聲明的每個資源都將被關閉。它具有和在finally塊中手動關閉它一樣的效果。在塊本身之前或之內聲明的每個資源都不會自動關閉。每個實現'Autoclosable'接口的對象都可以用於試用資源。在這裏看到更多[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –

+0

它是Hadoop FS,但它是在創建該try塊之前創建的。 – user432024

回答

3

From the JLS你可以發現,

資源是左到右的順序初始化。如果資源未能初始化(即其初始化表達式會引發異常),那麼由try-with-resources語句初始化的所有資源都將關閉。如果所有資源都成功初始化,則try塊將正常執行,然後try-with-resources語句的所有非空資源都將關閉。

資源以與初始化相反的順序關閉。僅當資源初始化爲非空值時才關閉資源。關閉一個資源時的異常並不妨礙關閉其他資源。如果之前由初始化程序,try塊或資源關閉引發異常,則會抑制此異常。

只有實例聲明在ResourceSpecification塊將在聲明的相反的順序被關閉。

所以要回答你,因爲fs是在此之前聲明的試用資源,實例將不會關閉。

+0

將其標記爲答案,因爲它有更多細節。 – user432024

+0

正如你應該的!這是一個很好的答案。有一個upvote。 – Bathsheba

4

只有reader.close()被調用;在程序控制到達}之前的概念上,這將包括在try塊中拋出異常的情況。

但是您需要以正常方式處理fs

+0

,但是他不能在塊中聲明'fs'作爲單獨的源並將其用於以下源? – SomeJavaGuy

+0

我可以但重點在於fs是外部實例化的。 – user432024