【Java-笔试面试】try、catch、finally 执行顺序超详细讲解。

1、无异常情况

情况一:都无 return 代码如下:
 public static int test(){
        int i = 1;
        try {
            ++i;
            System.out.println("try i = "+i);
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);

        }finally {
            ++i;
            System.out.println("finally i = "+i);
        }
        return i;
    }
//  结果:
//    try i = 2
//    finally i = 3
//    3

此时代码按正常 try-> finally 的顺序执行。

情况二:try 中有 return
public static int test2(){
        int i = 1;
        try {
            ++i;
            System.out.println("try i = "+i);
            return i;
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);

        }finally {
            ++i;
            System.out.println("finally i = "+i);
        }
        return 0;
    }
// 结果
//		try i = 2
//      finally i = 3
//      2

此时执行顺序可以看出是 try 先执行,但是执行到 return 时,在最后提交的时候没有提交,转而去执行 finally 了,执行finally 后,在最后执行为执行完的 try 中的 return。

情况三:try、finally中有return
    public static int test21(){
        int i = 1;
        try {
            ++i;
            System.out.println("try i = "+i);
            return i;
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);

        }finally {
            ++i;
            System.out.println("finally i = "+i);
            return i;
        }

    }
// 结果    
//			  try i = 2
//            finally i = 3
//            3

此时执行顺序可以看出是先执行 try ,但是没执行完 try 中的 return,转而去执行 finally 中的代码了,但是 finally 中的 return 不会执行一半去执行其他代码,而是直接执行完 return ,所以 try 中的 return 就相当于无效了。

【注意:由于没有异常,所以 catch 中的代码始终都不会执行,所以这里就不需要考虑 catch 中是否有 return了。】

2、有异常情况

情况一:都无 return

都没用return时代码如下:

public static int test13(){
        int i = 1;
        try {
            ++i;
            System.out.println("try1 i = "+i);
            int j = i/0;
            System.out.println("try2 i = "+i);
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);
        }finally {
            ++i;
            System.out.println("finally i = "+i);
        }
        return i;
    }
 // 结果
//      try1 i = 2
//		catch i = 3
//      finally i = 4
//      4

当都没有return时,程序执行顺序为 先执行 try,遇到异常后执行catch,最后执行finally,异常后的代码是不执行的。

情况二:try 中有 return

其实情况一就已经能推理处情况二的结果了,因为异常后的代码是不会执行的,所有情况二结果与情况一一致。代码如下:

 public static int test3(){
        int i = 1;
        try {
            ++i;
            System.out.println("try1 i = "+i);
            int j = i/0;
            System.out.println("try2 i = "+i);
            return i;
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);
        }finally {
            ++i;
            System.out.println("finally i = "+i);
        }
        return i;
    }
// 结果
//    try1 i = 2
//	  catch i = 3
//    finally i = 4
//    4
情况三:try、catch 中有 return

代码如下:

public static int test5(){
        int i = 1;
        try {
            ++i;
            System.out.println("try1 i = "+i);
            int j = i/0;
            System.out.println("try2 i = "+i);
            return i;
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);
            return i;
        }finally {
            ++i;
            System.out.println("finally i = "+i);
        }

    }
// 结果
//    try1 i = 2
//	  catch i = 3
//    finally i = 4
//    3

此时我们分析一下,首先try中的return肯定是不会执行的,因为是异常后面的代码。所有就会执行catch中的return,但是又有finally,所有就会在catch的return执行到一半时转去执行finally,最后在执行完catch后面的return。

情况四:try、catch、finally 都有 return
  public static int test6(){
        int i = 1;
        try {
            ++i;
            System.out.println("try1 i = "+i);
            int j = i/0;
            System.out.println("try2 i = "+i);
            return i;
        }catch (Exception e){
            ++i;
            System.out.println("catch i = "+i);
            return i;
        }finally {
            ++i;
            System.out.println("finally i = "+i);
            return i;
        }

    }
// 结果
//    try1 i = 2
//	  catch i = 3
//    finally i = 4
//    4

此时我们能看到,先执行try中代码,遇到异常转去执行catch中代码,此时catch中有return,在这个return执行到一半时会去执行finally,但是finally中也有return,finally中的return会直接一次性执行完。

总结

try、catch中若有return,都会执行到一半转向去执行finally(如果有的话),但是finally中的return不会分步执行,是一气呵成的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值