为要由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)) {
...
}