try-with-resources 关闭异常中的流控制
Flow Control in try-with-resources close exception
我无法通过 Google 搜索找到答案,所以我在这里提问(寻求导航帮助)。
如果一个是return一个try-with-resources块中的一个值,close方法抛出异常,我处理异常不抛,恢复执行,就是我试过的值returnreturned,还是在 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
被 returned。
它与 close()
操作有关,该操作在允许方法 return 之前必须在 try-with-resources
语句中调用。
我没有找到指定 return 案例的 JLS 的特定部分。
所以你必须考虑一般解释是适用的:
...
If all resources initialize successfully, the try block executes as
normal and then all non-null resources of the try-with-resources
statement are closed.
请注意,如果没有 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
不能 return 的原因应该是有道理的。
请注意,编译器由 try-with-resources
生成的代码比我提供的伪等价代码要长得多,也复杂得多,因为它抑制了异常。但这不是你的问题,所以让我赞成这个观点。
我无法通过 Google 搜索找到答案,所以我在这里提问(寻求导航帮助)。 如果一个是return一个try-with-resources块中的一个值,close方法抛出异常,我处理异常不抛,恢复执行,就是我试过的值returnreturned,还是在 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
被 returned。
它与 close()
操作有关,该操作在允许方法 return 之前必须在 try-with-resources
语句中调用。
我没有找到指定 return 案例的 JLS 的特定部分。
所以你必须考虑一般解释是适用的:
...
If all resources initialize successfully, the try block executes as normal and then all non-null resources of the try-with-resources statement are closed.
请注意,如果没有 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
不能 return 的原因应该是有道理的。
请注意,编译器由 try-with-resources
生成的代码比我提供的伪等价代码要长得多,也复杂得多,因为它抑制了异常。但这不是你的问题,所以让我赞成这个观点。