面试官:`try { return “a“; } finally { return “b“; }` 到底返回什么?99% 的人第一次都答错了! Java 面试中经常会出现这样一道经典题publicstaticStringtest(){try{returna;}finally{returnb;}}很多人第一反应是返回a因为try先执行。也有人认为finally只是执行一下不会影响返回值。其实这两种答案都错了。正确答案是b为什么今天我们就把这道经典面试题彻底讲明白。一、为什么返回的是b很多初学者认为try{returna;}执行到这里方法就已经结束了。实际上Java 并不是这样工作的。当执行到returna;JVM 并不会立刻返回而是会经历下面几个步骤执行 try ↓ 遇到 return a ↓ 先把返回值保存起来 ↓ 执行 finally ↓ finally 中又执行 return b ↓ 覆盖之前保存的返回值 ↓ 最终返回 b所以try{returna;}finally{returnb;}最终返回b二、可以理解成下面这段伪代码为了方便理解可以把 JVM 的执行过程想象成Stringresult;try{resulta;}finally{resultb;}returnresult;虽然真正的 JVM 不是这样实现的但这样理解非常容易记忆。最后result b因此返回b三、如果 finally 没有 return 呢例如publicstaticStringtest(){try{returna;}finally{System.out.println(finally);}}输出finally a原因很简单finally只是执行了一段代码并没有修改返回值。所以返回仍然是 a。四、finally 中写 return 有什么问题来看下面这段代码publicstaticinttest(){try{inta10/0;return1;}finally{return2;}}很多人会认为应该抛出ArithmeticException实际上运行结果却是2为什么因为finally{return2;}不仅覆盖了return1;甚至连ArithmeticException也一起吞掉了。这意味着异常不会继续向外抛出。这也是为什么很多 Java 开发规范都明确要求不要在 finally 中写 return。五、实际开发中为什么不推荐这样写主要有两个原因第一会覆盖 try 或 catch 中的返回值。程序原本应该返回的数据可能被finally改掉容易造成逻辑错误。第二会吞掉异常。如果try中发生异常而finally又执行了return异常就不会继续抛出排查问题会变得非常困难。因此在企业开发中finally一般只负责关闭数据库连接关闭文件流释放锁清理资源而不会写return。六、面试如何回答如果面试官问try { return a; } finally { return b; }返回什么为什么可以这样回答最终返回b。因为try中执行return时JVM 会先保存返回值但不会立即返回而是继续执行finally。如果finally中也有return它会覆盖try中保存的返回值因此最终返回b。另外在实际开发中不建议在finally中写return因为它不仅会覆盖返回值还可能吞掉异常。七、总结记住下面几点即可try中的return不会立即返回。JVM 会先执行finally。如果finally中也有return会覆盖try的返回值。finally中的return还可能吞掉异常因此实际开发中应避免使用。一句话总结try中的return会先保存返回值但真正返回前一定会执行finally如果finally中也有return最终返回的一定是finally的结果。