Java try与资源创建的执行顺序

Java try与资源创建的执行顺序,java,stream,try-catch,java-7,Java,Stream,Try Catch,Java 7,我尝试使用资源块,从Blob对象创建ObjectInputStream的新实例,例如 try(ObjectInputStream mObjectStream = new ObjectInputStream(mblob.getBinaryStream())) { ... } 但是,如果在.getBinaryStream()抛出异常,mObjectStream对象可能未发布,这与我的应用程序有关 我已考虑将其分开如下 try(InputStream mStream = mblob.getBinar

我尝试使用资源块,从Blob对象创建ObjectInputStream的新实例,例如

try(ObjectInputStream mObjectStream = new ObjectInputStream(mblob.getBinaryStream()))
{
...
}
但是,如果在.getBinaryStream()抛出异常,mObjectStream对象可能未发布,这与我的应用程序有关

我已考虑将其分开如下

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

}
如果先创建mObjectStream,这会导致问题吗?或者在这种情况下,总是先创建mStream

try(InputStream mStream = mblob.getBinaryStream();
 ObjectInputStream mObjectStream = new ObjectInputStream(mStream))
当您列出并打开多个资源时,它们将按照声明顺序创建。i、 首先创建e mStream,然后创建mObjectStream


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

这应该不是问题:如果
getBinaryStream()
引发异常,那么将不会首先创建
mObjectStream
,因为构造函数仅在
getBinaryStream()
返回后调用

但是,要回答后续问题:

  • 是的,我相信try with resources语句是按发生顺序计算的
  • 如果不是,您总是可以在末尾添加自己的
    finally
    块来显式关闭它
  • 请注意,报告中说:

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


    谢谢,这正是我想知道的。我接受了这个答案,因为它直接链接到文档。