![](/img/trans.png)
[英]Why suppressed exception of try-with-resource is handled in a reverse order of execution?
[英]Execution order of try-with-resource resource creation
我有一個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工具,總是在這種情況下,第一次創建這個事業的問題?
try(InputStream mStream = mblob.getBinaryStream();
ObjectInputStream mObjectStream = new ObjectInputStream(mStream))
當您列出並打開多個資源時,將按照聲明它們的順序創建它們。 即首先創建mStream,然后創建mObjectStream。
此外,它們將以相反的順序關閉。 最新的一個將先關閉,然后是舊的。
這應該不成問題:如果getBinaryStream()
引發異常,則不會首先創建mObjectStream
,因為僅在getBinaryStream()
返回之后才調用構造函數。
但是要回答后續問題:
finally
塊,以便自己明確關閉它。 請注意, JLS $ 14.20.3說明了這一點:
資源按從左到右的順序初始化。 如果資源無法初始化 (即,其初始化程序表達式拋出異常), 則會關閉try-with-resources語句到目前為止初始化的所有資源 。 如果所有資源都成功初始化,則try塊將正常執行,然后關閉try-with-resources語句的所有非空資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.