簡體   English   中英

Java 嘗試在參數上使用資源

[英]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

PrintWriterclose方法也將關閉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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM