- 它是正確的,如果我使用實現接口java.lang.AutoCloseable的資源,我不需要關閉它在finally塊,它會被關閉,即使一個異常會被拋出?
是的。
如果是這樣,是否有一個必須存在的先決條件? (例如,在try塊中創建資源?)
資源必須在try-with-resources語句(見下文)中創建。
- try-with-resources聲明究竟意味着什麼?
這裏一試,與資源聲明:
try (FileReader fr = FileReader(path)) {
// use fr here
}
注意FileReader
的初始化是如何在的try
(新()
部分)。這就是聲明如何知道以後需要關閉什麼。
(在the tutorial更多,但我不喜歡他們的第一個例子,因爲它依賴於A)的BufferedReader
構造函數從不拋出的事實,和B),其BufferedReader
將關閉FileReader
當BufferedReader
被關閉的事實。這些都是爲BufferedReader
真實的,但它是在一般情況下,一個貧窮的例子。)
全堅韌不拔的細節,包括一個什麼樣的try-with-resources
看起來像舊try/catch/finally
格式,在the specification翻譯。
請注意,您可以在語句中創建多個資源;他們在創造相反的順序關閉:
try (
FileReader fr =
new FileReader(fileName);
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(fr)
) {
// ...use `nifty` here
}
雖然你可能寫:
try (
NiftyThingUsingReader nifty =
new NiftyThingUsingReader(new FileReader(fileName))
) {
// ...use `nifty` here
}
...你必須知道肯定該NiftyThingUsingReader(FileReader)
不會拋出一個異常,並且NiftyThingUsingReader#close
將關閉底層的FileReader
,因爲它將而不是由try-with-resources本身處理。如果您不確定,請將它們分開,以便即使NiftyThingUsingReader(FileReader)
構造函數拋出並且即使NiftyThingUsingReader#close
未關閉它,try-with-resources語句也會關閉FileReader
。
資源不必相互依賴(直接);例如,這就是你想要的輸入和輸出要處理一個相當普遍的情況:
try (
java.util.zip.ZipFile zf =
new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer =
java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
// Enumerate each entry
for (java.util.Enumeration entries =
zf.entries(); entries.hasMoreElements();) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName =
((java.util.zip.ZipEntry)entries.nextElement()).getName() +
newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
相關:先試與資源等同於Java 1.6的(http://stackoverflow.com/questions/23611940/try-with-resources-equivalent-in-java-1-6) – zapl
[Java7試用資源聲明優點]的可能重複(http://stackoverflow.com/questions/17739362/java7-try- with-resources-statement-advantage) – mkierc
只需幾次點擊就能給你答案 – Dici