try-catch-finally中throw,return时的执行顺序

在我们使用try-catch-finally来捕获处理异常的时候,我们可能会存在一些疑惑,比如,什么时候执行catch中的程序模块,什么时候执行finally找那个的模块?
首先,要肯定的时,catch的程序模块只会在当前的try中的代码出现异常的时,被catch所捕获后,此时就会执行catch中的代码块。而finally却是无论try模块是否出现了异常的情况下,都会执行的。
1.如果当前的try模块中没有出现异常,那么在执行完,try中的语句后,就会正常执行到finally中的代码。
2.如果当前的try模块中出现了异常的情况的时候,执行的顺序是什么呢?此时就会是try只会执行完当前出现异常的语句的前一句,然后进入到catch中执行,catch中的代码块,但是此时又会分情况来考虑的,如:
(1)当前的catch语句中有throw语句的时候,此时会先将异常抛出,然后执行finally中的代码,但是此时只是抛出了异常,却没有马上对异常进行处理,只有finally中的代码执行完后,才会去上一层处理异常。
(2)当前的catch语句中出现了return语句的时候,那么此时就会先执行所有return前的代码块,然后执行return语句,但是此时的程序没有马上结束,还会继续执行finally中的代码块后,才会去真正的将结果return。
我们可以看一段代码:

    @Override
    @Transactional
    public Object assetORGDelete(Map<String, Object> map) {
        try {
            if(judgeORGRelevanceExist(map)){
                throw new BusinessException("该资管计划已关联资产,不允许删除!");
            }
            // 删除基本信息
            this.assetORGMapper.deleteAssetORGInfo(map);
            // 删除监管信息
            this.assetORGMapper.deleteAssetORGPlan(map);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
//          return new CommResponse(true);
        } finally {
            System.out.print("该资管计划已关联资产,不允许删除!");
        }
        return new CommResponse(true);
    }

在这个代码中,如果我们catch中是抛出异常时,我们在finally和catch中分别打一个断点的时候,执行顺序: e.printStackTrace(); –> throw e; –>System.out.print(“该资管计划已关联资产,不允许删除!”);
如果我们catch中是return时,我们在finally和catch中分别打一个断点的时候,执行顺序: e.printStackTrace(); –> return new CommResponse(true); –>System.out.print(“该资管计划已关联资产,不允许删除!”); –>return new CommResponse(true);

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,我们可以在trycatchfinally分别进行returnthrow异常。下面是一些示例代码: 1. 在try进行return: ``` public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); } finally { System.out.println("执行finally块"); } return -1; // 这里的返回值不会被执行,因为在try已经return了 } ``` 2. 在catch进行return: ``` public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); return -1; } finally { System.out.println("执行finally块"); } } ``` 3. 在finally进行return: ``` public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); } finally { System.out.println("执行finally块"); return -1; } } ``` 4. 在try进行throw异常: ``` public static int divide(int a, int b) throws ArithmeticException { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); throw e; } finally { System.out.println("执行finally块"); } } ``` 5. 在catch进行throw异常: ``` public static int divide(int a, int b) throws ArithmeticException { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); throw e; } finally { System.out.println("执行finally块"); } } ``` 6. 在finally进行throw异常: ``` public static int divide(int a, int b) throws ArithmeticException { try { return a / b; } catch (ArithmeticException e) { System.out.println("除数不能为0"); } finally { System.out.println("执行finally块"); throw new ArithmeticException("执行finally发生异常"); } } ``` 需要注意的是,如果在trycatchfinally都进行了return语句或throw异常语句,那么最终执行的是finally的语句。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值