繁体   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