try-catch-finally中return的执行情况

public  class  Test2 {
     public  static  void  main(String[] args) {
         System.out.print( "in main b = "  + tt());
     }
 
     public  static  int  tt() 
{
         int  b =  23 ;
         try 
{
             return  b =  88 ;//赋值操作会执行,但不返回
        
finally 
{
             System.out.println( "in finally b = "  + b);//由于上面已赋值88
             b =  66 ;(3)
             System.out.println( "after being assigned, b = "  + b);
             return  b =  44 ;//(1)
         }
//(1)与(2)不能同时存在,不然编译错误
//return b = 50;//(2)
     }
}
 
 
in  finally  b =  88
after being assigned, b =  66
in main b =  44
 
如果同时注释(1)与(2),则 in main b = 88,语句(3)不会改变返回值作用。
 
调用javap -c Test后得到的字节码序列,首先在 try 中的 return b = 88; 时,执行了 b =88; 这句代码,然后并不返回, 而是把 88 保存在一个临时的地方,并去执行 finally 中的代码。 finally 执行完后,从取出那个临时的地方取出 88 返回。 如果在 finally中有return b = 44; 这句,则在执行到这里时,又把 44放在了起先保存 88 的位置,这里如果再取的时候,返回结果就是44了。 不过到底这个返回值是由try里的return返回的,还是由finally里的return返回的,我还不太清楚。 我倾向于是由finally里的try返回的。
 
根据java规范:在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终 返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是 finally中的代码是必须要执行的,而且是在return前执行,除非碰到exit()。
 
 
try中没有异常的情况下try、catch、finally的执行顺序 try --- finally
如果try中有异常,执行顺序是try --- catch --- finally
如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return
如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return
总之 finally 永远执行!
try-catch-finally里都没有return ,finally 之后有个return ,如果try中有异常,finally执行完后,还能执行return吗?那是不可能执行的了,try中有异常以后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,所以你的return是不会执行的
 
    在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch中,在finally中,在finally后(try-catch-finally外的语句块)。
    在这4个位置都出现return的情况下(事实上应该是不可能的,如果前面3个位置都存在return,那么最后一个位置的return就成了unreachable code,编译不会通过),最终会执行的return应该是finally中的return。也就是finally中的return会覆盖掉其它位置的return
try中有return语句

-------- try catch finally顺序:
1.try {}.
2.如果有Error Exception则,执行catch(){}中的代码。
3.无论有没有 Error Exception都要执行finally{}中的代码。
4.执行 try 中的 return

catch中有return

 但当finally中不存在return,而catch中存在return,但finally中的语句又会对catch中的return的值产生影响时,情况就有点复杂。

int ret = 0;
try{
throw new Exception();
}
catch(Exception e){
ret = 1;
return ret;
}
finally{
ret = 2;
}
这里finally中没有return,但是将catch中要return的ret赋值为2.那么 最后返回的值是1. 为什么?
从调试中可以知道Finally中的赋值语句的确被执行了,而执行完这条finally语句后的下一条语句就是catch中的return,那么为啥返回的是1呢?
catch中有return,finally中没有return,return的值在执行finally之前已经确定下来了。
另一个值得注意的是最后的return(位于try-catch-finally外)并没有被执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值