[英]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.