为要由 java 的 try with resources 语句管理的资源声明自变量

Posted

技术标签:

【中文标题】为要由 java 的 try with resources 语句管理的资源声明自变量【英文标题】:Declaring independent variables for resources to be managed by java's try with resources statement 【发布时间】:2014-07-22 13:15:37 【问题描述】:

以下两个选项在语义上有区别吗?在自动资源管理方面,它们中的任何一个都比另一个更安全吗?

选项1:

 try ( ObjectInputStream in = new ObjectInputStream(new
          FileInputStream("fooFile")) ) 
     ...
    

选项2:

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

【问题讨论】:

我不确定,但我认为在第二个示例中,两个流分别关闭,如果 ObjectInputStream 缓存一些数据并且 FileInputStream 先关闭,这可能会出现问题。跨度> @isnot2bad 他们总是保证以相反的顺序关闭。所以在我上面的代码中in 将首先关闭,然后只有fin 将被关闭。所以你的观点没有实际意义。 唯一的区别是你会在fin上得到一个多余的close调用,但根据AutoCloseable合约,这不会导致任何错误。 很简单,fin 被声明为托管资源,因此它自然会调用其close 方法。这将是多余的,因为此时它已经关闭(in.close() 已在内部级联到 fin.close())。 ***.com/a/21348893/1419315 存在的论点本质上是,对于第一个变体,FileInputStream.close ()ObjectInputStream构造 失败时不会被调用。 【参考方案1】:

请看这里:http://www.***.com/a/21348893/1419315

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

【讨论】:

以上是关于为要由 java 的 try with resources 语句管理的资源声明自变量的主要内容,如果未能解决你的问题,请参考以下文章

tryresources优于try-finally

java 7 try-with-resource 语法错误

java try-with-resource语句使用

java中的try-with-resources和return语句

try-with-resources:Java 是不是对 .close() 的调用顺序做出任何保证?

在 Java 7 try-with-resources 的 Clover 检测后编译失败