结论:
-
当finally中没有return,但是try中有return时
1)当finally调用的任何可变API,会修改返回值;
2)当finally调用任何的不可变API,对返回值没有影响。 - 当finally中有return,直接返回finally中的变量,不返回try中的变量
- 可变API:如 对象,StringBuilder 这样的内部对象可变的API,
- 不可变可变API:如基本类型int,包装类型Integer,String类型
String底层的数组是用final修饰的,是一个数组常量,而StringBuilder底层用来接收存储字符的数组是一个变量.所以前者在创建之后是没法更改,而后者可以)
原理参考:https://blog.csdn.net/weixin_41005006/article/details/80643681
测试样例:
当finally中没有return,但是try中有return时
int testInt() {
int x = 0;
try {
x++;
return x;
} finally {
x++;
}
}
String testString() {
String x = "";
try {
x = x + "hello";
return x;
} finally {
x = x + "world";
}
}
Integer testInteger() {
Integer in = new Integer(0);
try {
in = 1;
return in;
} finally {
in = new Integer(3);
}
}
User testObject() {
User user = new User(0);
try {
user.age = 1;
return user;
} finally {
user.age = 3;
}
}
当finally中有return
int testInt_return() {
int x = 0;
try {
x++;
return x;
} finally {
x++;
return x;
}
}
String testString_return() {
String x = "";
try {
x = x + "hello";
return x;
} finally {
x = x + "world";
return x;
}
}
Integer testInteger_return() {
Integer in = new Integer(0);
try {
in = 1;
return in;
} finally {
in = 3;
return in;
}
}
User testObject_return() {
User user = new User(0);
try {
user.age = 1;
return user;
} finally {
user.age = 3;
return user;
}
}
执行结果:
public static void main(String[] args) {
System.out.println("testInt:\t" + new Main().testInt());
System.out.println("testString:\t" + new Main().testString());
System.out.println("testInteger:\t" + new Main().testInteger());
System.out.println("testObject:\t" + new Main().testObject().age);
System.out.println("----finally含return---");
System.out.println("testInt_return:\t" + new Main().testInt_return());
System.out.println("testString_return:\t" + new Main().testString_return());
System.out.println("testInteger_return:\t" + new Main().testInteger_return());
System.out.println("testObject_return:\t" + new Main().testObject_return().age);
}
testInt: 1
testString: hello
testInteger: 1
testObject: 3
----finally含return---
testInt_return: 2
testString_return: helloworld
testInteger_return: 3
testObject_return: 3