Java try-with-resources中close抛异常时返回值逻辑咨询
关于try-with-resources中return与close异常的返回逻辑咨询解答
你的问题描述
你提到在谷歌搜索未找到相关答案,特此咨询:假设在try-with-resources代码块中执行return语句返回某个值,但资源的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; }
直接结论
这段代码最终会返回1,不会执行最后的return 2;。
执行流程拆解
咱们跟着JVM的执行步骤一步步看:
- 进入
test()方法,创建Foo实例并赋值给foo,进入try-with-resources块。 - 执行
return 1;:此时JVM会先把返回值1暂存到一个临时区域,不会立刻结束方法——因为try-with-resources机制强制要求资源的close()方法必须被调用,所以要先处理资源关闭逻辑。 - 自动调用
foo.close():该方法抛出RuntimeException。 - 异常被catch块捕获:你在catch中处理了异常但没有重新抛出,因此这个异常被“消化”,不会向上传播。
- 方法收尾:由于之前已经暂存了返回值
1,方法会直接返回这个暂存值,完全不会走到最后的return 2;。
补充说明
如果在catch块中重新抛出异常,那么方法会直接抛出该异常,不会返回任何值(包括之前暂存的1)。但你的代码中没有重新抛出异常,因此会正常返回之前保存的1。
内容的提问来源于stack exchange,提问作者Sir Intellegence-BrainStormexe
相关产品推荐
相关产品推荐

