簡體   English   中英

嘗試資源中的流控制關閉異常

[英]Flow Control in try-with-resources close exception

我無法通過Google搜索找到答案,因此請在此處提出要求(以獲取導航幫助)。 如果要在try-with-resources塊中返回一個值,則close方法會引發異常,我不拋出異常就處理該異常,然后恢復執行,是我嘗試返回的值,還是在catch之后恢復執行塊? 例如:

public static int test(){
    class Foo implements AutoCloseable{
        @Override
        public void close(){
            throw new RuntimeException();
        }
    }
    try(Foo foo = new Foo()){
        return 1;
    }
    catch (RuntimeException e){
        //handle exception without throwing
    }
    return 2;
}

引發異常導致執行到達catch語句,因此返回2
它與close()操作有關,該操作在允許方法返回之前必須在try-with-resources語句中調用。

我沒有找到JLS的特定部分來指定返回的情況。
因此,您必須考慮以下一般解釋:

14.20.3。 嘗試與-資源

...

如果所有資源都成功初始化,則try塊將正常執行,然后try-with-resources語句的所有非空資源都將關閉。

請注意,如果沒有try-with-resources ,您可能會編寫以下代碼:

try(Foo foo = new Foo()){
    return 1;
}
catch (RuntimeException e){
    //handle exception without throwing
}
return 2;

通過這種方式 :

try{
    Foo foo = new Foo();
    foo.close(); // handled automatically by  try-with-resources 
    return 1;
}       
catch (RuntimeException e){
    //handle exception without throwing
}
return 2;

因此,為什么不能返回1應該很有意義。
請注意,由於抑制了異常,編譯器通過try-with-resources生成的代碼比我提供的偽等效項長得多,也更復雜。 但這不是您的問題,所以讓我贊成這種觀點。

暫無
暫無

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

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