Rol*_*our 19 java java-7 try-with-resources
我在网上和“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
}
Run Code Online (Sandbox Code Playgroud)
这个例子没有问题,BufferedWriter它会自动关闭,然后关闭FileWriter; 但是,在其他情况下,如果我们以这种方式声明 2 个嵌套资源:
try (AutoClosable res = new Impl2(new Impl1())) {... }
Run Code Online (Sandbox Code Playgroud)
我想可能会发生new Impl1()性能良好但new Impl2()崩溃的情况,在这种情况下,Java 将没有引用Impl1, 以关闭它。
像这样始终独立声明多个资源(即使在这种情况下不需要)难道不是更好的做法吗?
try(FileWriter fw = new FileWriter(fileName);
BufferedWriter writer = new BufferedWriter(fw)){ ... }
Run Code Online (Sandbox Code Playgroud)
Amo*_*len 14
经过一番搜索,我找到了这篇文章:https : //dzone.com/articles/carefully-specify-multiple-resources-in-single-try
根据定义,JLS 14.20.3 aResourceList由Resources 分隔;。基于此,我们可以得出结论,嵌套初始化就像AutoClosable res = new Impl2(new Impl1())是单个资源。由于为try-with-resources多个资源定义的规则在此处不适用,重要的是:
资源按从左到右的顺序初始化。如果一个资源初始化失败(也就是说,它的初始化表达式抛出一个异常),那么到目前为止由 try-with-resources 语句初始化的所有资源都将被关闭。如果所有资源都成功初始化,则 try 块将正常执行,然后关闭 try-with-resources 语句的所有非空资源。
资源以与它们被初始化的顺序相反的顺序关闭。资源只有在初始化为非空值时才会关闭。关闭一个资源的异常不会阻止其他资源的关闭。如果先前由初始化程序、try 块或资源关闭引发异常,则此类异常将被抑制。
更重要的是,Implt1#close()除非在内部显式调用,否则不会被调用Impl2#close()
简而言之,最好在用 分隔的单独语句中声明多个资源;,如下所示:
try(Impl1 impl1 = new Impl1();
Impl2 impl2 = new Impl2(impl1))
Run Code Online (Sandbox Code Playgroud)