try catch finally 的执行顺序

情况一:

//return 放在trycatch之外
public class TestTryCatch {
    public static void main(String[] args) {
        testBasic1();
    }
    public static int testBasic1(){
        int i = 1;
        try {
            i++;
            System.out.println("try.....i="+i);
        }catch (Exception e){
            i++;
            System.out.println("catch....i="+i);
        }finally {
            i=10;
            System.out.println("finally...i="+i);
        }
        return i;
    }
}
    /*  
    代码的执行结果:
    try.....i=2
    finally...i=10
    */

结论:

这段代码会按照顺序执行,先执行try内的代码段,没有异常的话进入finally,最后返回

情况二:

//将return放到try catch中
public class TestTryCatch {
    public static void main(String[] args) {
        //情况一
        //testBasic1();
        //情况二
        testBasic2();
    }

    public static int testBasic2(){
        int i = 1;
        try {
            i++;
            System.out.println("try.....i="+i);
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch.....i="+i);
            return i;
        }finally {
            i=10;
            System.out.println("finally...i="+i);
        }
    }
}
    /*
    执行结果
   try.....i=2
   finally...i=10
    */

结论:

代码的执行顺序从try到catch,由于finally是无论如何都会执行的,所以try里的语句并不会直接返回. 在try语句中的return,return返回的引用变量并不是try语句外定义的引用变量i',而是系统重新定义了一个局部引用i,这个引用指向了引用i对应的值,也就是2, 即使在finally语句中吧引用i指向了10,因为return返回的引用已经不是i,而是i',所以引用的值和try的返回值无关了

情况三:

//将return放入finally中
public class TestTryCatch {
    public static void main(String[] args) {
        //testBasic1();
        //testBasic2();
        testBasic3();
    }
    public static int testBasic3(){
        int i = 1;
        try {
            i++;
            System.out.println("try block,i="+i);
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch block,i="+i);
            return i;
        }finally {
            i = 10;
            System.out.println("finally block,i="+i);
        }
    }
}
    /*
     输出结果
     try block,i=2
     finally block,i=10
    */

结论:可以看到,是从finally语句块中返回的。可见,JVM是忽略了try中的return语句。

情况四:

public class TestTryCatch {
    public static void main(String[] args) {
        //testBasic1();
        //testBasic2();
        //testBasic3();
         testBasic4();
    }
    //在try中加入一段有异常的代码
    public static int testBasic4(){
        int i = 1;
        try {
            i++;
            int m = i/0;
            System.out.println("try block,i="+i);
            return i;
        }catch (Exception e){
            i++;
            System.out.println("catch block,i="+i);
            return  i;
        }finally{
            i = 10;
            System.out.println("finally block,i="+i);
            return  i;
        }
    }
}
    /* 
    执行结果:
    catch block,i=3
    finally block,i=10
    
    */

结论:因为finally中有return语句,try、catch中的异常被消化掉了,屏蔽了异常的发生

情况五:

 

public class TestTryCatch {
    public static void main(String[] args) {
        //testBasic1();
        //testBasic2();
        //testBasic3();
        //testBasic4();
        testBasic5();
    }
    //finally中有异常发生
    public static int testBasic5(){
        int i = 1;
        try {
            i++;
            Integer.parseInt(null);
            System.out.println("try block,i="+i);
            return i;
        }catch (Exception e){
            String.valueOf(null);
            System.out.println("catch block,i="+i);
            return i;
        }finally {
            i = 10;
            int m=i/0;
            System.out.println("finally block,i="+i);
        }
    }
}
    /*
     Exception in thread "main" java.lang.ArithmeticException: / by zero
     */

总结:一旦finally里发生异常,try、catch里的异常信息即被消化掉了,也达不到异常信息处理的目的。

总结以上的测试:

  1. finally语句总会执行
  2. 如果try catch中有return语句,finally中没有return语句,那么在finally中修改除包装类型和静态变量.全局变量以外的数据都不会对try catch中返回的变量有影响
  3. 尽量不要在finally中使用return语句,如果使用的话,会忽略try catch中的返回语句,也会忽略try catch中的异常,屏蔽了错误的发生
  4. finally中避免再次抛出异常,一旦finally中发生异常,代码执行将会抛出finally中的异常信息,try catch中的异常将被忽略
  5. 在实际项目中,finally常常用来关闭流或者数据库资源的,并不额外做其他操作

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值