您的位置:首页 > 编程语言

异常处理:finally块中代码什么时候执行总结!

2017-05-23 08:33 323 查看
             在java语言异常处理中,finally块的作用就是不管有没有异常都会进行执行,经常被用在需要释放资源的情况下。但是程序执行return就意味着结束当前函数的调用并跳出这个函数体,所以所有语句都只能在return前执行(除非有exit函数)。finally语句也是在return 之前执行的。但是当try catch finally中都有return 语句的时候是怎么执行?


             从上面图片代码可以看出finally确实在return之前执行了。如果finally中也有return 执行顺序又是怎样?



              从上面图片的代码可以看出如果finally中也有return的话将会覆盖其他语句中的return。

              因为在一个方法内部定义的变量都是存储在栈中的,当这个函数结束后,其对应的栈就会被收回,此时在其方法体重定义的变量将不存在。所以return在返回时不是直接返回变量的值,而是复制一份,然后返回。因此,对于基本数据类型来说,在finally块中改变return的值对返回值没有影响,而引用类型的数据会有影响。




              上面图片的代码证明了基本数据类型来说,在finally块中改变return的值对返回值没有影响,而引用类型的数据会有影响。
  
              那么问题来了finally是否一定会被执行?



可以看到当在try之前有异常的时候程序就直接结束了,不会执行finally。



当try语句中有System.exit(0);语句的时候也不会执行finally。因为System.exit(0);强制程序退出,所以就无法再执行之后的代码了。同理在catch代码块中添加System.exit(0);语句也不会再去执行finally。

          finally与final和finalize的区别是什么?

          final 用于声明属性、方法和类,分别表示属性不可变,方法不可覆盖和类不可继承。String就是被final修饰的。

          finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收的对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。一旦垃圾回收器准备好释放对象占用的内存,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会正在回收对象占用的内存。
            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐