You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的执行步骤一步步看:

  1. 进入test()方法,创建Foo实例并赋值给foo,进入try-with-resources块。
  2. 执行return 1;:此时JVM会先把返回值1暂存到一个临时区域,不会立刻结束方法——因为try-with-resources机制强制要求资源的close()方法必须被调用,所以要先处理资源关闭逻辑。
  3. 自动调用foo.close():该方法抛出RuntimeException。
  4. 异常被catch块捕获:你在catch中处理了异常但没有重新抛出,因此这个异常被“消化”,不会向上传播。
  5. 方法收尾:由于之前已经暂存了返回值1,方法会直接返回这个暂存值,完全不会走到最后的return 2;。

补充说明

如果在catch块中重新抛出异常,那么方法会直接抛出该异常,不会返回任何值(包括之前暂存的1)。但你的代码中没有重新抛出异常,因此会正常返回之前保存的1。

内容的提问来源于stack exchange,提问作者Sir Intellegence-BrainStormexe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:24