創建資源我有以下嘗試塊和fs這是一個關閉是以前創建的。嘗試資源不在嘗試塊
它會關閉嗎?還是我們需要明確地關閉它在終端?
try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) {
...
}
創建資源我有以下嘗試塊和fs這是一個關閉是以前創建的。嘗試資源不在嘗試塊
它會關閉嗎?還是我們需要明確地關閉它在終端?
try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) {
...
}
From the JLS你可以發現,
資源是左到右的順序初始化。如果資源未能初始化(即其初始化表達式會引發異常),那麼由try-with-resources語句初始化的所有資源都將關閉。如果所有資源都成功初始化,則try塊將正常執行,然後try-with-resources語句的所有非空資源都將關閉。
資源以與初始化相反的順序關閉。僅當資源初始化爲非空值時才關閉資源。關閉一個資源時的異常並不妨礙關閉其他資源。如果之前由初始化程序,try塊或資源關閉引發異常,則會抑制此異常。
只有實例聲明在ResourceSpecification塊將在聲明的相反的順序被關閉。
所以要回答你,因爲fs
是在此之前聲明的試用資源,實例將不會關閉。
將其標記爲答案,因爲它有更多細節。 – user432024
正如你應該的!這是一個很好的答案。有一個upvote。 – Bathsheba
只有reader.close()
被調用;在程序控制到達}
之前的概念上,這將包括在try
塊中拋出異常的情況。
但是您需要以正常方式處理fs
。
,但是他不能在塊中聲明'fs'作爲單獨的源並將其用於以下源? – SomeJavaGuy
我可以但重點在於fs是外部實例化的。 – user432024
fs究竟是什麼?之後在** try-with-resources括號內聲明的每個資源都將被關閉。它具有和在finally塊中手動關閉它一樣的效果。在塊本身之前或之內聲明的每個資源都不會自動關閉。每個實現'Autoclosable'接口的對象都可以用於試用資源。在這裏看到更多[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –
它是Hadoop FS,但它是在創建該try塊之前創建的。 – user432024