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);

猜你喜欢

转载自blog.csdn.net/csdn_duanjiao2016/article/details/78522410
今日推荐