有return的情况下try catch finally的执行顺序

来源:互联网 发布:js动态获取input的值 编辑:程序博客网 时间:2024/05/22 04:48

总结一下:

1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行,执行完之后才会执行return;
3、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。

finally中有return会吃掉异常的

需要注意的是:

在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
但是,如果 需要返回的值不是基本类型,是引用类型的话,还是会改变的。

结论:

1.影响返回结果的前提是在 非 finally 语句块中有 return 且非基本类型
2.不影响返回结果 的前提是 非 finally 块中有return 且为基本类型

究其本质 基本类型在栈中存储,返回的是真实的值,而引用类型返回的是其浅拷贝堆地址.所以才会改变~,但是,经测试date类型的数据也是不受影响的,因为date类实现了serializable序列化接口,利用对象序列化可以进行对象的”深复制”,即复制对象本身及引用的对象本身。所以和基本类型类似,try中副本的地址和之后在finally中修改的值得地址不同,所以不会改变。

0 0
原创粉丝点击