try-catch-finally详解

作为java程序员,try -catch-finally  这三个是组合是再常见不过了。但如果没有用好这对搭档的话,会出现很多意外的问题。

 

例一:

 

这个程序会是什么结果呢? i是0还是1:可以思考一下


运行结果是:

try
finally
1



原因,但使用javac进行编译的时候,会对代码进行优化

 

 

  


仔细观察上面优化后的代码是不是把try里面的return给去掉的,jvm认为finally中有return  ,而且在执行try代码块的return之前一定会执行finally,那干脆把try中的return给去掉,所以返回的是2

 

 

 

 

例二:

 

 

  

这个程序会是什么结果呢? i是0还是1:继续思考


运行结果是:

try
finally
0

 

 

原因,同样jvm会对代码进行优化

 

 


这个时候finally中没有return,优化的规则有变了 ,jvm知道正常情况下执行try块的return之前一定要执行finally(finally并没有return)   ,以防try执行return值之前被finally中的程序改变值。程序非常聪明,这个时候会多出一个临时变量j,看以上代码执行过程都能明白try返回的是j的值,finally中的i++对返回值并没有影响。



总结:平时写代码既不要在try中return,也不要在finally中return,正确的的应该只在方法末尾return

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值