异常处理: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。
finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收的对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。一旦垃圾回收器准备好释放对象占用的内存,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会正在回收对象占用的内存。
从上面图片代码可以看出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()方法,并在下一次垃圾回收动作发生时,才会正在回收对象占用的内存。
相关文章推荐
- try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就
- JAVA——finally块中的代码什么时候被执行、执行的效果是什么?
- trycatch之catch对捕获异常的处理及后续代码的执行的探索
- Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
- 代码阅读总结之Fitch and Mather 7.0(asp.net发生异常或错误时错误提示页面的处理方法)
- finally块中的代码什么时候被执行?finally是不是一定会被执行?(见最后引申)
- Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
- java Finally块中代码什么时候执行
- 09 java的代码的执行顺序和异常处理
- PHP码农平衡性--写代码的快慢,代码执行效率,日志统计,异常处理等
- 关于Form KeyDown事件的处理代码执行两次的问题
- 关于项目中异常处理的一些总结
- 关于项目中异常处理的一些总结
- 异常处理总结 (clone from cnblog 08年07月24日)
- Java异常处理总结
- RFID会议签到系统总结(四)-- 异常处理与日志记录
- java异常处理执行过程
- SEH异常处理学习总结
- 如何在程序异常或正常退出JVM时执行特定代码
- HTMLParser(一个比较流行的html代码解析、处理开源项目)学习,总结