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