java中try、catch、finally执行顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fibonacci2015/article/details/82347437

在面试的时候,经常会问到关于try、catch、finally相关的问题。总结一下。

case 1

    try{ } catch{ } finally{ } return;

    public int condition1(){
        try {
            System.out.println(1);
        } catch (Exception e){
            System.out.println(2);
        } finally {
            System.out.println(3);
        }
        return 4;
    }

    执行顺序为 try --> finally --> return,打印结果 1,3,4。因为没有报错,所以catch是不会执行的。

case 2

     try{ return; } catch{ } finally{ } return;

    public int condition2(){
        try {
            System.out.println(1);
            return 2;
        } catch (Exception e){
            System.out.println(3);
        } finally {
            System.out.println(4);
        }
        return 5;
    }

    执行顺序为 try --> finally --> try中的return,打印结果1,4,2。finally的执行顺序优先于return,而且不管报错与否一定会执行,所以在可能出错的io操作中,在finally中关闭io流。

case 3

    try{ } catch{ return; } finally{ } 

    public int condition3(){
        try {
            System.out.println(1);
            throw new RuntimeException();
        } catch (Exception e){
            System.out.println(2);
            return 3;
        } finally {
            System.out.println(4);
        }
//        return 5;
    }

    为了让程序出错,直接抛出了异常。最后一行的return注掉了,因为catch中已经确定了return,最后的return语句无法执行到,idea会报错。正常的代码中,不会有这种操作,因为异常不是百分百抛出的。

    执行顺序 try --> catch --> finally --> catch中的return,打印结果1,2,4,3。return代表整个代码块的结束,如果先执行return,就没finally什么事了,更不会存在finally无论在什么情况下都会执行的预设。

case 4

    try{ return;  } catch{ return; } finally{ return; } 

    public int condition4(){
        try {
            System.out.println(1);
            return 2;
        } catch (Exception e){
            System.out.println(3);
            return 4;
        } finally {
            System.out.println(5);
            return 6;
        }
//        return 7;
    }

    无异常抛出,执行顺序  try --> catch --> finally --> finally中的return,打印结果 1,5,6。

case 5

    try{  } catch{ return; } finally{ return; } 

    public int condition5(){
        try {
            System.out.println(1);
            throw new RuntimeException();
        } catch (Exception e){
            System.out.println(2);
            return 3;
        } finally {
            System.out.println(4);
            return 5;
        }
//        return 6;
    }

    有异常抛出,执行顺序 try --> catch --> finally --> finally中的return,打印结果 1,2,3,5。

结论:1.执行顺序为 try --> catch --> finally --> return。

           2.任何情况下,finally都会执行,如果finally中有return,则会提前结束返回。一般情况下,不在finally中写return。

           3.try,catch中有return,会先执行finally,再执行return

          4.如果finally中对返回的变量值再次进行修改,try,catch中的return还是修改前的值。即,finally执行前,return的值已经写好,只不过是在等finally执行完以后,再执行。

猜你喜欢

转载自blog.csdn.net/fibonacci2015/article/details/82347437