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

Java 在未在Try块中创建的资源上尝试使用资源,java,Java,我有下面的try块和fs,它是以前创建的可关闭的 它会被关闭吗?还是我们需要在一个finally中显式地关闭它 try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) { ... } 仅调用reader.close();从概念上讲,就在程序控制到达}之前,这将包括在try块中引发异常的情况 但是您需要以正常的方式处理fs。只调用reader.close();从概念上讲,就在程序

我有下面的try块和fs,它是以前创建的可关闭的

它会被关闭吗?还是我们需要在一个finally中显式地关闭它

try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) {
...
}
仅调用
reader.close()
;从概念上讲,就在程序控制到达
}
之前,这将包括在
try
块中引发异常的情况

但是您需要以正常的方式处理
fs

只调用
reader.close()
;从概念上讲,就在程序控制到达
}
之前,这将包括在
try
块中引发异常的情况

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

资源按从左到右的顺序初始化。如果资源未能初始化(即,其初始值设定项表达式引发异常),那么到目前为止由try with resources语句初始化的所有资源都将关闭。如果所有资源初始化成功,try块将正常执行,然后try with resources语句的所有非空资源都将关闭

资源的关闭顺序与初始化时的顺序相反。资源只有在初始化为非空值时才会关闭。关闭一个资源时出现的异常不会阻止关闭其他资源。如果初始值设定项、try块或关闭资源之前引发了异常,则会抑制此类异常

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

因此,为了回答您的问题,由于在使用资源进行此尝试之前声明了
fs
,因此不会关闭该实例。

您可以发现

资源按从左到右的顺序初始化。如果资源未能初始化(即,其初始值设定项表达式引发异常),那么到目前为止由try with resources语句初始化的所有资源都将关闭。如果所有资源初始化成功,try块将正常执行,然后try with resources语句的所有非空资源都将关闭

资源的关闭顺序与初始化时的顺序相反。资源只有在初始化为非空值时才会关闭。关闭一个资源时出现的异常不会阻止关闭其他资源。如果初始值设定项、try块或关闭资源之前引发了异常,则会抑制此类异常

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


为了回答您的问题,因为在使用资源进行此尝试之前声明了
fs
,实例不会被关闭。

但是他不能在块中将
fs
声明为一个单独的源,并将其用于以下源吗?我可以,但问题是fs是在外部实例化的。但是他不能在块中将
fs
声明为一个单独的源,并将其用于以下源吗?我可以,但问题是fs是外部实例化的。fs到底是什么?在try with resources圆括号内声明的每个资源随后都会关闭。它的效果与在finally块中手动关闭它的效果相同。块本身之前或内部声明的每个资源都不会自动关闭。每个实现了
Autoclosable
接口的对象都可以在资源试用中使用。更多信息请参见这里的Hadoop FS,但它是在进入try块之前创建的。FS到底是什么?在try with resources圆括号内声明的每个资源随后都会关闭。它的效果与在finally块中手动关闭它的效果相同。块本身之前或内部声明的每个资源都不会自动关闭。每个实现了
Autoclosable
接口的对象都可以在资源试用中使用。更多信息请参见这里的Hadoop FS,但它是在到达该try块之前创建的。将此标记为答案,因为它有更多细节。将此标记为答案,因为它有更多细节。