繁体   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