return 与 try catch finally 的执行顺序

结果:

  1. finally 块中的代码都会执行
  2. try 和catch 中有return时,finally依然会执行
  3. return 在try catch 中的,返回值是 return运算后的值,finally 是在return 表达式运算后 执行的(但是不会返回finally运算后的值,而是先把return 运算后要保存的值存起来,不管finally 中的代码块这么执行,返回值都不会改变,任然返回return 运算后的值),因此return 返回值不会随着finally的改变而改变。
  4. finally 中最好不要包含return,否则程序会提前提出,返回值不是try,catch中保存的返回值。

案例:

  1.  
    try{} catch(){}finally{} return;
    --------------------------------
    顺序执行
  2. try{ return; }catch(){} finally{} return;
    --------------------------------
    程序执行try块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,最后执行try中return;
    finally块之后的语句return,因为程序在try中已经return所以不再执行。
  3. try{ } catch(){return;} finally{} return;
    --------------------------------------
    程序先执行try,如果遇到异常执行catch块,
    有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。
    无异常:执行完try再finally再return.
  4. try{ return; }catch(){} finally{return;}
    --------------------------------------
    程序执行try块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,因为finally块中有return所以提前退出。
  5. try{} catch(){return;}finally{return;}
    -----------------------------------------
    程序执行catch块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,因为finally块中有return所以提前退出。
  6. try{ return;}catch(){return;} finally{return;}
    -------------------------------------------
    程序执行try块中return之前(包括return语句中的表达式运算)代码;
    有异常:执行catch块中return之前(包括return语句中的表达式运算)代码; 则再执行finally块,因为finally块中有return所以提前退出。
    无异常:则再执行finally块,因为finally块中有return所以提前退出。
public class Demo {

    public static String m1(){
        String str="";
        try{
            str = "Hello";
            return str;
        }catch (Exception e){
            str = "Exception";
            return str;
        }finally{
            str = "haha";
        }
    }
    public static void main(String[] args) {
        System.out.println(m1());
    }
}
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
它应该使用栈保存返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值