为要由java管理的资源声明自变量';让我们试试资源语句

为要由java管理的资源声明自变量';让我们试试资源语句,java,file-io,java-7,try-with-resources,Java,File Io,Java 7,Try With Resources,以下两个选项之间有语义差异吗?在自动资源管理方面,它们中的任何一个是否比另一个更安全 try (FileInputStream fin = new FileInputStream("fooFile"); ObjectInputStream in = new ObjectInputStream(fin)) { ... } 备选案文1: try (FileInputStream fin = new FileInputStream("foo

以下两个选项之间有语义差异吗?在自动资源管理方面,它们中的任何一个是否比另一个更安全

 try (FileInputStream fin = new FileInputStream("fooFile");
             ObjectInputStream in = new ObjectInputStream(fin)) {
            ...
   }
备选案文1:

 try (FileInputStream fin = new FileInputStream("fooFile");
             ObjectInputStream in = new ObjectInputStream(fin)) {
            ...
   }
备选案文2:

 try (FileInputStream fin = new FileInputStream("fooFile");
             ObjectInputStream in = new ObjectInputStream(fin)) {
            ...
   }
请看这里:

 try (FileInputStream fin = new FileInputStream("fooFile");
             ObjectInputStream in = new ObjectInputStream(fin)) {
            ...
   }

这里的论点本质上是,对于第一个变量,
FileInputStream.close()
在构建
ObjectInputStream
失败时将不会被调用。

我不确定,但我认为在第二个示例中,这两个流分别关闭,如果
ObjectInputStream
缓存了一些数据,并且
FileInputStream
先关闭,则可能会出现问题。@isnot2但它们总是保证以相反的顺序关闭。因此,在我上面的代码中,
in
将首先关闭,然后只有
fin
将关闭。这使你的观点变得毫无意义。唯一的区别是,你会在
fin
上得到一个冗余的
close
调用,但根据
AutoCloseable
契约,这不会导致任何错误。很简单,
fin
被声明为托管资源,因此它自然会调用其
close
方法。它将是多余的,因为它在该点已经关闭(
in.close()
已内部级联到
fin.close()
)。这里的论点本质上是,对于第一个变量,
FileInputStream.close()
在构建
ObjectInputStream
失败时将不会被调用。
 try (FileInputStream fin = new FileInputStream("fooFile");
             ObjectInputStream in = new ObjectInputStream(fin)) {
            ...
   }