try-with-resources 关闭异常中的流控制
Posted
技术标签:
【中文标题】try-with-resources 关闭异常中的流控制【英文标题】:Flow Control in try-with-resources close exception 【发布时间】:2018-05-09 17:32:50 【问题描述】:我无法通过 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;
【问题讨论】:
我没有看到标记重复链接的东西...我打算将它链接到***.com/q/39777022/1366594 Break doesn't work in try with resources, but work in try without resources的可能重复 提供示例代码可以使事情更清楚。 【参考方案1】:异常抛出导致执行到达catch
语句,因此返回2
。
它与close()
操作有关,在允许方法返回之前,必须在try-with-resources
语句中调用该操作。
我没有找到 JLS 的特定部分指定返回的情况。 所以你必须考虑到一般解释是适用的:
14.20.3. try-with-resources
...
如果所有资源初始化成功,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
生成的代码比我提供的伪等价代码更长、更复杂,因为抑制了异常。但这不是你的问题,所以让我赞成这个观点。
【讨论】:
以上是关于try-with-resources 关闭异常中的流控制的主要内容,如果未能解决你的问题,请参考以下文章
1.9 try-with-resources 优先于try-finally
[Java开发之路](20)try-with-resource 异常声明