簡體   English   中英

try-with-resource資源創建的執行順序

[英]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()返回之后才調用構造函數。

但是要回答后續問題:

  1. 是的,我相信try-with-resources語句是按照發生的順序進行評估的。
  2. 如果不是,您可以隨時添加自己的finally塊,以便自己明確關閉它。

請注意, JLS $ 14.20.3說明了這一點:

資源按從左到右的順序初始化。 如果資源無法初始化 (即,其初始化程序表達式拋出異常), 則會關閉try-with-resources語句到目前為止初始化的所有資源 如果所有資源都成功初始化,則try塊將正常執行,然后關閉try-with-resources語句的所有非空資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM