java中try、catch、finally执行顺序

在面试的时候,经常会问到关于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执行完以后,再执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值