我有以下try块,之前创建了一个可关闭的fs。
它会被关闭还是我们需要在finally中明确关闭它?
try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) {
...
}
答案 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
,实例不会被关闭。