try catch finally,try里有return,finally还执行么?(最强总结)

看了部分别人的答案,自己最后还是想要总结一下。该篇文章是最好的一篇总结,在我认为。有错误的地方,还望之处。转载请告知link地址。tankyou!!


在try语句中,try要把返回的结果放置到不同的局部变量当中,执行finaly之后,从中取出返回结果,因此,即使finaly中对变量进行了改变,但是不会影响返回结果,因为使用栈保存返回值,即使在finaly当中进行数值操作,但是影响不到之前保存下来的具体的值,所以return影响不了基本类型的值,这里使用的栈保存返回值。而如果修改list,map,自定义类等引用类型时,在进入了finaly之前保存了引用的地址, 所以在finaly中引用地址指向的内容改变了,影响了返回值。

总结:
         1.影响返回结果的前提是在 非 finally 语句块中有 return 且非基本类型
         2.不影响返回结果 的前提是 非 finally 块中有return 且为基本类型
究其本质 基本类型在栈中存储,返回的是真实的值,而引用类型返回的是其浅拷贝堆地址.所以才会改变。
        return的若是对象,则先把对象的副本保存起来,也就是说保存的是指向对象的地址。若对原来的对象进行修改。对象的地址仍然不变,return的副本仍然是指向这个对象,所用finally中对对象的修改仍然有作用。而基本数据类型保存的是原原本本的数据,return保存副本后,在finally中修改都是修改原来的数据。副本中的数据还是不变,所以finally中修改对return无影响。



如下图所示
基本类型:
运行结果:
代码片段

int test() {

int x = 1;

try {

x++;

returnx;

} finally {

x++;

}

}


public staticvoid main(String[] args) {

try {

Test01 test01 =new Test01();

System.out.println(test01.test());;

} catch (Exceptione) {

e.printStackTrace();

}

}

引用类型:
运行结果:
代码片段:

publicstatic List<String> test10(){

List<String> strlist =new ArrayList<String>();  

        strlist.add("zs");  

        strlist.add("ls");  

        strlist.add("ww");  

        strlist.add("mz");

        

        try{  

            strlist.add("wq");  

            returnstrlist;  

        } finally {  

            strlist.add("yyy");  

       

}  


public staticvoid main(String[] args) {

try {

Test01 test01 =new Test01();

System.out.println(test01.test10());;

} catch (Exceptione) {

e.printStackTrace();

}

}


以上就是我的总结,如果我的总结对你有帮助,请点个赞。tankyou!!


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值