答案是:try中return值被暂存,finally必执行,其return会覆盖try。基本类型返回原值,引用类型内容可变。

在Java中,try块中的return语句并不会立即执行并退出方法,如果存在finally块,它的执行顺序是有明确规则的。理解这个顺序对避免逻辑错误非常重要。
1. try中有return,但没有finally
这种情况下,try块中的return语句会正常执行,方法直接返回对应的值,不会有任何特殊处理。示例:
public static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
}
}
// 返回 1
2. try中有return,同时有finally块
这是关键场景。即使try中遇到return,JVM也会先保留return的值,然后强制执行finally块中的代码,最后才真正返回。具体流程如下:
- 执行try块中的代码,遇到return时,会暂存要返回的值
- 跳转到finally块,执行其中的所有语句
- finally执行完后,再将之前暂存的值返回
示例1:基本类型返回值
立即学习“Java免费学习笔记(深入)”;
本文档是Groovy入门教程;简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中。作为跑在JVM中的另一种语言,groovy语法与 Java 语言的语法很相似。同时,Groovy 抛弃了java烦琐的文法。同样的语句,使用groovy能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音。感兴趣的朋友可以过来看看
public static int test() {
int result = 0;
try {
result = 1;
return result; // 暂存 result = 1
} finally {
result = 2;
System.out.println("finally中result=" + result); // 输出 2
}
}
// 最终返回的是 1,不是 2
虽然finally修改了result,但由于return的值已经暂存,所以返回值仍是1。
示例2:引用类型的情况
public static StringBuilder test() {
StringBuilder sb = new StringBuilder("hello");
try {
return sb; // 返回的是sb的引用
} finally {
sb.append(", world"); // 修改对象内容
}
}
// 返回的对象内容是 "hello, world"
这里返回的是引用,finally修改了对象内部状态,因此最终返回的对象内容被改变了。
3. finally中有return会怎样?
如果finally块中也有return语句,它会覆盖try中的return,导致try中的return失效。示例:
public static int test() {
try {
return 1;
} finally {
return 2; // 直接返回2,try中的return被忽略
}
}
// 返回 2
这种情况不推荐使用,会导致代码难以理解和维护。
基本上就这些。try中的return会被暂存,finally一定会执行,且finally中的return会覆盖前面的。注意基本类型和引用类型的差异,避免踩坑。









