java 关于 try catch finally 执行顺序

2 篇文章 0 订阅

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修饰的,所以修改不了里面的值,所以返回的结果和值引用是一样的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值