您的位置:首页 > 其它

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

2017-11-13 17:13 549 查看
在我们使用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: