try-with-resources关闭异常中的流控制

时间:2018-05-09 17:32:50

标签: java try-with-resources

我无法通过Google搜索找到答案,所以我在这里问它(导航帮助)。 如果要在try-with-resources块中返回一个值,则close方法抛出异常,我处理异常而不抛出,并且恢复执行,是我尝试返回的值返回,或者执行后恢复执行块?例如:

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;
}

1 个答案:

答案 0 :(得分:1)

抛出异常导致执行到达catch语句,因此返回2 它与允许方法返回之前必须在close()语句中调用的try-with-resources操作相关。

我没有找到指定返回案例的JLS的特定部分 所以你必须考虑一般的解释是适用的:

  

14.20.3. try-with-resources

     

...

     

如果所有资源都成功初始化,则try块执行为   normal,然后是try-with-resources的所有非null资源   声明已经结束。

请注意,如果没有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生成的代码比我提供的伪等价更长更复杂。但这不是你的问题,所以让我赞成这个观点。