[英]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的特定部分來指定返回的情況。
因此,您必須考慮以下一般解釋:
...
如果所有資源都成功初始化,則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.