目录
测试代码:
package xyz.jangle.finallytest;
public class TestReturn {
public String test() {
String a = "1";
try {
return a;
} finally {
System.out.println("finally");
a="2";
}
}
public A test2() {
A a = new A();
a.varA="1";
a.varB="2";
try {
return a;
} finally {
a.setVarA("11");
}
}
public static void main(String[] args) {
TestReturn testReturn = new TestReturn();
// 基本数据类型返回结果会被暂存,finally操作不会影响返回结果
String test = testReturn.test();
System.out.println(test);
// 引用类型的对象内容被修改后,finally操作会影响返回结果(因为暂存的是对象的地址)
A test2 = testReturn.test2();
System.out.println(test2.getVarA());
}
class A {
private String varA,varB;
public String getVarA() {
return varA;
}
public void setVarA(String varA) {
this.varA = varA;
}
public String getVarB() {
return varB;
}
public void setVarB(String varB) {
this.varB = varB;
}
}
}
执行结果:
finally
1
11
结论:
finally块会影响return的值,但这种影响取决于返回值的类型和finally块中的操作。
基本类型返回值
当返回的是基本数据类型(如int、double等)时,finally块中的操作不会改变try或catch块中的返回值。因为在返回的那一刻,返回值会被暂存起来,finally块中的操作不会影响这个暂存的值。例如,如果在try块中返回一个int类型的值,然后在finally块中修改这个值的赋值,这个修改并不会反映在try块中的返回值上12。
引用数据类型返回值
当返回的是引用数据类型时,finally块中的操作可能会影响返回值。因为在这种情况下,返回值保存的是对象的引用,finally块中对对象内容的修改会反映在最终的返回值上。例如,如果在try块中返回一个对象,然后在finally块中修改这个对象的某个属性,这个修改会影响最终的返回值13。
finally块中return的影响
如果在finally块中使用return语句,它会覆盖try或catch块中的返回值。这是因为在finally块中的return会结束方法的执行并立即返回指定的值,从而覆盖之前的返回值。这种情况需要特别注意,因为它可能导致逻辑错误和不易调试的问题
参考文献:百度AI