You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Java try-catch-finally返回值机制疑问:为何finally影响返回结果

为什么try-catch-finally的return逻辑和预期不一样?

这个问题戳中了Java里try-catch-finally执行流程的关键细节,很多开发者刚接触的时候都会踩这个坑,我来给你拆解清楚:

首先先把你的代码贴出来方便对照:

public class ReturnValueFromTryCatchFinally { 
    public static void main(String[] args) { 
        System.out.println(methodReturningValue()); 
    } 
    static String methodReturningValue() { 
        String s = null; 
        try { 
            s = "return value from try block"; 
            return s; 
        } catch (Exception e) { 
            s = s + "return value from catch block"; 
            return s; 
        } finally { 
            s = s + "return value from finally block"; 
            // return s; 
        } 
    } 
}

第一个场景:finally块没有return s;时的执行逻辑

你以为会先从try块返回,再执行finally块?其实Java的规则是:当try/catch里执行return时,会先暂存要返回的值,然后暂停return操作,优先执行finally块,之后再完成之前的return

具体到你的代码:

  • try块里给s赋值为"return value from try block",然后执行return s;——这时候Java会把这个字符串的值暂时存起来,不会立刻返回。
  • 接着执行finally块,把s拼接成"return value from try blockreturn value from finally block",但这个修改只影响变量s本身,不会改变之前暂存的返回值。
  • finally执行完后,Java才会把之前暂存的那个原始字符串返回给调用方,所以System.out.println只会输出一次"return value from try block"

第二个场景:取消finally里return s;注释后的逻辑

这时候情况就变了:

  • 同样,try块执行到return s;时,先暂存返回值,然后进入finally块。
  • finally块里修改s后,执行了return s;——这会直接覆盖之前暂存的返回值,并且终止整个方法的执行,不会再回到try块的return流程。
  • 所以最终返回的是拼接后的字符串,System.out.println输出"return value from try blockreturn value from finally block"

为什么不会输出两次?

核心原因是:一个方法只能返回一次methodReturningValue()作为一个方法,不管中间经过try、finally多少步骤,最终只会给调用方返回一个结果。try里的return只是触发了finally的执行,但并没有完成返回动作;只有等finally执行完毕(或者finally里直接return),才会完成一次返回,所以只会有一次输出。

内容的提问来源于stack exchange,提问作者Nikhil Sharma

火山引擎 最新活动