我有一个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 会导致问题吗?
答案 0 :(得分:3)
try(InputStream mStream = mblob.getBinaryStream();
ObjectInputStream mObjectStream = new ObjectInputStream(mStream))
列出并打开多个资源时,将按照声明的顺序创建它们。即首先创建mStream,然后是mObjectStream。
此外,它们将以相反的顺序关闭。最新的一个将先关闭,然后是旧的。
答案 1 :(得分:3)
这不应该是一个问题:如果getBinaryStream()
抛出异常,那么mObjectStream
首先不会被创建,因为构造函数只在{{1}之后调用}返回。
然而,要回答后续问题:
getBinaryStream()
块,以便自行明确关闭。请注意,JLS $14.20.3说明了这一点:
资源按从左到右的顺序初始化。 如果资源无法初始化(即,其初始化程序表达式抛出异常),则关闭目前由try-with-resources语句初始化的所有资源。如果所有资源都成功初始化,则try块将正常执行,然后关闭try-with-resources语句的所有非空资源。