try-with-resource资源创建的执行顺序

时间:2015-02-17 12:12:24

标签: java stream try-catch java-7

我有一个try-with-resource块,可以从 Blob 对象创建一个 ObjectInputStream 的新实例,例如

try(ObjectInputStream mObjectStream = new ObjectInputStream(mblob.getBinaryStream()))
{
...
}

但是,如果在 .getBinaryStream()中抛出异常, mObjectStream 对象可能会未发布,这与我的应用程序有关。

我考虑将其分开如下

try(InputStream mStream = mblob.getBinaryStream(); ObjectInputStream mObjectStream = new ObjectInputStream(mStream){
...

}

如果首先创建 mObjectStream ,或者在这种情况下始终首先创建 mStream 会导致问题吗?

2 个答案:

答案 0 :(得分:3)

try(InputStream mStream = mblob.getBinaryStream();
 ObjectInputStream mObjectStream = new ObjectInputStream(mStream))

列出并打开多个资源时,将按照声明的顺序创建它们。即首先创建mStream,然后是mObjectStream。

此外,它们将以相反的顺序关闭。最新的一个将先关闭,然后是旧的。

答案 1 :(得分:3)

这不应该是一个问题:如果getBinaryStream()抛出异常,那么mObjectStream首先不会被创建,因为构造函数只在{{1}之后调用}返回。

然而,要回答后续问题:

  1. 是的,我相信try-with-resources语句是按照发生的顺序进行评估的。
  2. 如果不是,您可以随时添加自己的getBinaryStream()块,以便自行明确关闭。
  3. 请注意,JLS $14.20.3说明了这一点:

      

    资源按从左到右的顺序初始化。 如果资源无法初始化(即,其初始化程序表达式抛出异常),则关闭目前由try-with-resources语句初始化的所有资源。如果所有资源都成功初始化,则try块将正常执行,然后关闭try-with-resources语句的所有非空资源。