在 java 中,如果 return 语句位于 finally 块中,它会无条件地覆盖之前 try 或 catch 块中定义的返回值,导致原返回值丢失。具体做法是避免在 finally 中使用 return,或者确保 finally 中的逻辑不会改变控制流,否则程序将直接执行 finally 的返回并忽略之前的结果。

try-catch-finally 中 return 的执行顺序是怎样的
当 try 块中有 return 时,JVM 会先计算返回值并将其暂存,随后执行 finally 块。如果 finally 块中没有 return,则最终返回暂存的值;如果 finally 块中有 return,则会丢弃暂存值并返回新值。

public class ReturnTrap {
public static int getValue() {
try {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(getValue());
}
}
运行上述代码,控制台输出结果为:2。这证实了 finally 中的 return 覆盖了 try 中的返回值。
立即学习“Java免费学习笔记(深入)”;
如果在 finally 中修改了返回值对应的对象会发生什么
如果返回值是基本数据类型(如 int),finally 中的修改不会影响已计算的返回值;但如果返回值是引用类型(如对象),且在 try 中返回了该对象的引用,finally 中对对象内容的修改会影响调用者看到的值,除非 finally 中重新赋值了引用变量本身。

import java.util.ArrayList;
import java.util.List;
public class ReferenceReturn {
public static List<String> getList() {
List<String> list = new ArrayList<>();
list.add("A");
try {
return list;
} finally {
list.add("B");
}
}
public static void main(String[] args) {
List<String> result = getList();
System.out.println(result);
}
}
运行上述代码,控制台输出结果为:[A, B]。因为 return 返回的是引用,finally 中对列表内容的修改依然生效。
如果 finally 中包含异常,原来的返回值还会保留吗
如果 finally 块中抛出异常,那么无论 try 或 catch 中是否有返回值或异常,当前的方法调用都会立即终止,并将 finally 抛出的异常向上传播。原有的返回值或异常将被完全丢弃,调用者只能捕获到 finally 中的异常。


















