小知识点java中的finally和return

finally 语句块一定会执行吗? 


finally 语句块没有执行,说明什么问题呢?

只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。

(1)try语句没有被执行到,如在try语句之前就return了,这样finally语句就不会执行。
(2)在finally语句之前有System.exit(0),System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。



程序先进入try语句块,在执行return num;语句之前,发现程序后面还有finally语句块,于是,先将要返回的值num=10缓存起来,然后程序跳转到finally语句块执行,在finally语句块中num值被修改为了20,而最终返回的结果却是10,这说明finally语句块执行完毕后,程序直接将之前try语句块缓存的值返回了。



Java虚拟机是如何编译finally语句块的呢?

Java方法是在栈帧中执行,栈帧是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块空间来作为该方法执行时的内存空间,栈帧分为三个区域:
1、操作数栈,用来保存正在执行的表达式中的操作数
2、局部变量区,用来保存方法中使用的变量,包括方法参数,方法内部声明的变量,以及方法中使用到的对象的成员变量或类的成员变量(静态变量),最后两种变量会复制到局部变量区,因此在多线程环境下,这种变量需要根据需要声明为volatile类型
3、字节码指令区


finally语句执行顺序如下:
1、执行:expression,计算该表达式,结果保存在操作数栈顶;
2、执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值;
3、执行:finally语句块中的代码;
4、执行:将第2步复制到局部变量区的返回值又复制回操作数栈顶;
5、执行:return指令,返回操作数栈顶的值;


当try-catch-finally语句块中包含return语句时,有以下几点结论:

如果finally中有return语句,finally中的return语句会”覆盖“掉try中的return语句,直接将finally中的值作为结果返回。
如果finally中没有return语句,也没有改变要返回的结果值,则执行完finally中的语句后,会接着执行try中的return语句,返回try之前保留的结果值。
如果finally中没有return语句,但是改变了要返回的结果值,这里有点类似与引用传递和值传递的区别,分以下两种情况:
        1)如果返回值是基本数据类型或字符串,try中的return语句依然会返回进入finally块之前保留的结果值。
        2)如果返回值是引用数据类型,try中的return语句返回的就是在finally中改变后的该对象的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值