try catch finally 的执行顺序
代码的执行情况是 try -> catch -> finally ,所以返回的顺序也是,如果try 里面有return,或者catch里面有return,会把return的对象返回到调用栈中,然后执行finally里面的逻辑,但是如果finally里面也有return 则会把调用栈里面的对象更新,如下代码:
public class TryCatchDemo {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
}
打印结果如下
如果在try 和catch返回值,在finally里不返回值,修改值,此时返回的栈的值并没有改变所以,finally修改没有效果。代码如下
public class TryCatchDemo {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
int a = 1;
try {
return a;
} catch (Exception e) {
return a;
} finally {
a ++;
}
}
}
返回结果
由于返回栈中的值没有变,所以修改是没有用的
但是如果我的返回栈中返回的是对象就不一样了,因为对象是存在堆中的,它的引用是存在栈中的,我们在finally里面修改修改的是堆里面的内容,所以返回值会变。代码如下
public class TryCatchDemo {
public static void main(String[] args) {
System.out.println(test());
}
private static User test() {
User user = new User("张三");
try {
return user;
} catch (Exception e) {
return user;
} finally {
user.setUserName("李四");
}
}
}
class User {
private String userName;
public User(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
'}';
}
}
执行结果如下
所以这种情况也得分开,看返回的是值还是引用,所以出现的结果也不一样,当然也有特例,如果你返回的对象是String 虽然是对象,但是它是final修饰的,所以修改不了里面的值,所以返回的结果和值引用是一样的情况。