try-catch-finally 语句的执行问题

关于这个经典问题,oracle其实有官方文档来进行阐释。 Execution of try-finally and try-catch-finally
本文试图对这部分文档做一个简单的修改,制成伪码形式,以加深记忆

java
// 翻译版
执行 try 块;
if(try 块的执行顺利完成){
执行 finally 块;
if(finally 块正常执行完成){
try 块执行正常完成; // 所以,即使try中有return语句,也会执行finally的;
}else if(finally 块由于原因 S 失败,结束执行){
try 块执行失败,原因 S;
}
}else if (try 块的执行由于抛出异常 v 而终止){
if(如果 v 能够与后续的 catch 语句异常类型匹配){
选择第一个匹配的 catch 语句进行 catch 语句执行;
if(catch 块正常执行){
执行 finally 块;
if(finally 块正常执行){
try 块正常结束执行;
else if(finally 块由于原因 S 异常终止){
try 块由于原因 S 异常终止;
}
}else if(catch 块由于原因 R 异常终止){
执行 finally 块;
if(finally 块正常执行){
try 语句由于原因 R 异常终止;
}else if(finally 块由于原因 S 异常终止){
try 语句由于原因 S 异常终止(原因 R 被忽略);
}
}
}else{
执行 finally 块;
if(finally 块正常执行完成){
try 语句抛出异常 v;
}else if (finally 块由于原因 S 异常终止){
try 语句由于原因 S 异常终止; ( 异常 v 将被无视)
}
}
}else if(try 语句由于其他原因 R 异常终止){
execute finally block;
if(finally 块正常执行){
try 语句由于 R 而异常终止;
}else if(finally 块由于原因 S 异常终止){
try 语句由于原因 S异常终止(原因 R 忽略掉);
}
}
// 英语原文
execute try block;
if(execution of try block completes normally){
execute finally block;
if(finally block completes normally){
try block completes normally;
}else if(finally block completes abruptly for reason S){
try statement completes abruptly for reason S;
}
}else if (execution of try block completes abruptly because of a throw of a value v){
if(v is assignment compatible with a catchable exception class of any catch clause){
the first matchable catch clause is selected;
execute the selected catch clause with parameter v;
if(catch block completes normally){
execute the finally block;
if(finally block completes normally){
try block completes normally;
else if(finally block completes abruptly for reason S){
try statement completes abruptly for reason S;
}
}else if(catch block completes abruptly for reason R){
execute finally block;
if(finally block completes normally){
try statement completes abruptly for reason R;
}else if(finally block completes abruptly for reason S){
try statement completes abruptly for reason S(and reason R is discarded);
}
}
}else{
execute finally block;
if(finally block completes normally){
try statement complete abruptly because of a throw of v;
}else if (finally block completes abruptly for reason S){
try statement complete abruptly because of the reason S; ( the throw of v is discard and forgotten)
}
}
}else if(execution of try block completes abruptly because of any other reason R){
execute finally block;
if(finally block completes normally){
try statement completes abruptly for reason R;
}else if(finally block completes abruptly for reason S){
try statement completes abruptly for reason S(and reason R is discarded);
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 人的一生,经历了出生、成长、老年、死亡... 长到每个人都要经历酸甜苦辣...但是同时,它又那么短,短到只有几个瞬...
    良心冷性阅读 9,641评论 1 1
  • «孩子:挑战»«无条件养育»«非暴力沟通» 当自己在做一件自认为很值得的事情的时候 ,总是希望能得到别人的...
    慧如月阅读 1,571评论 0 1
  • 我认为我们单位一个最好的福利就是一年一度的体检,体检项目基本涵盖了身体的各大器官,另外女工还有妇科的检查,真的有好...
    我是仙儿阅读 1,405评论 0 3
  • 作者:孔小姐 思考了很久标题用哪一个更好,本来想用(别告诉我你想做什么,告诉我你做了什么,)想想还是现在这个更合适...
    後青年阅读 3,749评论 4 3

友情链接更多精彩内容