参考:http://blog.youkuaiyun.com/kavensu/article/details/8067850
http://blog.youkuaiyun.com/qq_21399933/article/details/79056164(try catch finally 执行顺序的解释)
结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
对下方返回结果的解释:
1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
public class TestTryCatchFinally {
public static void main(String[] args) {
System.out.println("引用类型:" + new TestTryCatchFinally().testUser().toString());
System.out.println("基本类型:" + new TestTryCatchFinally().testInt());
}
static int testInt() {
int x = 1;
try {
x++;
return x;
} finally {
++x;
}
}
User testUser() {
User user = new User("aa", 10);
try {
int i = 5 / 0;
return user;
} catch (Exception e) {
user.age = 20;
return user;
} finally {
user.age = 30;
}
}
class User {
private String userName = "";
private int age = 20;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
}
执行结果:
引用类型:User{userName='aa', age=30}
基本类型:2