答案是:try中return值被暂存,finally必执行,其return会覆盖try。基本类型返回原值,引用类型内容可变。
在Java中,try块中的return语句并不会立即执行并退出方法,如果存在finally块,它的执行顺序是有明确规则的。理解这个顺序对避免逻辑错误非常重要。
示例:
public static int test() { try { return 1; } catch (Exception e) { return 2; } } // 返回 1
具体流程如下:
示例1:基本类型返回值
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修改了对象内部状态,因此最终返回的对象内容被改变了。
示例:
public static int test() {
try {
return 1;
} finally {
return 2; // 直接返回2,try中的return被忽略
}
}
// 返回 2
这种情况不推荐使用,会导致代码难以理解和维护。
基本上就这些。try中的return会被暂存,finally一定会执行,且finally中的return会覆盖前面的。注意基本类型和引用类型的差异,避免踩坑。