尝试使用未在try块中创建的资源上的资源

时间:2017-02-21 14:06:52

标签: java

我有以下try块,之前创建了一个可关闭的fs。

它会被关闭还是我们需要在finally中明确关闭它?

try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) {
...
}

2 个答案:

答案 0 :(得分:4)

仅调用reader.close();概念上就在程序控制到达}之前,这将包括在try块中抛出异常的情况。

但你需要以正常方式处理fs

答案 1 :(得分:3)

From the JLS你可以找到

  

资源按从左到右的顺序初始化。如果资源无法初始化(即,其初始化程序表达式抛出异常),则会关闭try-with-resources语句到目前为止初始化的所有资源。如果所有资源都成功初始化,则try块将正常执行,然后关闭try-with-resources语句的所有非空资源。

     

资源以与初始化时相反的顺序关闭。仅当资源初始化为非空值时才关闭资源。关闭一个资源的例外不会阻止关闭其他资源。如果先前由初始化程序,try块或资源关闭抛出异常,则会抑制此类异常。

只有 ResourceSpecification 块中的实例声明将以声明的相反顺序关闭。

所以回答你,因为在{em> try-with-resources 之前声明fs,实例不会被关闭。