[英]Java try with resources on parameters
這是一個愚蠢的問題,但我無法弄清楚。 我是否需要關閉在 try with resources 中作為參數傳遞的 Object ?
這是一個例子:
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
...
}
我需要打電話嗎
sw.close();
在 try 塊之后? 還是它會自動關閉所有作為參數傳遞的 Autocloseable 對象?
對PrintWriter
隱式調用close
實際上也會關閉底層Writer
。
請參閱以下示例:
StringWriter sw = new StringWriter() {
@Override
public void close() throws IOException {
super.close();
System.out.println("closed");
}
};
try (PrintWriter pw = new PrintWriter(sw)) {};
輸出
closed
PrintWriter
的close
方法也將關閉StringWriter
(但是......是的,沒有什么可以關閉的)。 這不是其他包裝器的常見情況。
您可以在try
塊中傳遞兩個對象以確保它們將被關閉:
try (StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw)) {
....
}
由於這兩個類都實現了AutoClosable
接口,您可以嘗試:
try(
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw)
) { ... }
它將自動關閉這兩個對象。
添加finally塊並關閉傳遞的對象。這是因為finally塊不管有沒有異常都會被執行。
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
...
}finally{
sw.close();
}
您可以在 try-with-resources 初始化塊中放置多個項目:
try (final StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
// ...
} catch (IOException e) {
// ...
}
兩者都會自動關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.