【发布时间】:2020-08-18 08:05:08
【问题描述】:
我在网上和“Effective Java”一书(作者 Joshua Bloch)中看到了这个示例。
try(BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))){
writer.write(str); // do something with the file we've opened
}
catch(IOException e){
// handle the exception
}
这个例子没有问题,BufferedWriter 会自动关闭,然后又会关闭FileWriter;但是,在其他情况下,如果我们这样声明 2 个嵌套资源:
try (AutoClosable res = new Impl2(new Impl1())) {... }
我猜new Impl1() 可能运行良好,但new Impl2() 崩溃,在这种情况下,Java 将不会引用Impl1,以便关闭它。
像这样总是独立声明多个资源(即使在这种情况下不需要)不是更好的做法吗?
try(FileWriter fw = new FileWriter(fileName);
BufferedWriter writer = new BufferedWriter(fw)){ ... }
【问题讨论】:
-
我会说这在很大程度上取决于外部构造函数的记录失败。如果他们说他们可能会失败,那么当然,在单独的资源中进行。我不认为
BufferedWriter的具体示例会失败,除非传递的作者为空。 -
我认为理所当然地这样做有可能导致其他奇怪的失败,因为如果外部资源的
close()方法也有,你最终会多次关闭内部资源关闭内部资源。同样,这取决于特定的资源,因为一些(少数?很多?大多数?)将处理关闭幂等。 -
还有一些情况下,外部 AutoClosable 会在其 close 方法中关闭内部 AutoClosable。
-
我不认为多次 close() 可能会失败,因为 1. 每个关闭都是在 try-catch 内完成的 2. 不会从隐式 finally 引发异常。但是,当您有这样的嵌套资源声明时,在这种情况下,我们可能会声明一个资源,但在其他情况下,我们必须声明多个资源。我觉得我们必须检查每个构造函数是否会失败,这很无聊。
-
@AndyTurner 幂等关闭is mandated:“如果流已经关闭,则调用此方法无效。”
标签: java java-7 try-with-resources