try-catch-finally 語(yǔ)句的執(zhí)行問題

關(guān)于這個(gè)經(jīng)典問題,oracle其實(shí)有官方文檔來進(jìn)行闡釋。 Execution of try-finally and try-catch-finally
本文試圖對(duì)這部分文檔做一個(gè)簡(jiǎn)單的修改,制成偽碼形式,以加深記憶

java
// 翻譯版
執(zhí)行 try 塊;
if(try 塊的執(zhí)行順利完成){
執(zhí)行 finally 塊;
if(finally 塊正常執(zhí)行完成){
try 塊執(zhí)行正常完成; // 所以,即使try中有return語(yǔ)句,也會(huì)執(zhí)行finally的;
}else if(finally 塊由于原因 S 失敗,結(jié)束執(zhí)行){
try 塊執(zhí)行失敗,原因 S;
}
}else if (try 塊的執(zhí)行由于拋出異常 v 而終止){
if(如果 v 能夠與后續(xù)的 catch 語(yǔ)句異常類型匹配){
選擇第一個(gè)匹配的 catch 語(yǔ)句進(jìn)行 catch 語(yǔ)句執(zhí)行;
if(catch 塊正常執(zhí)行){
執(zhí)行 finally 塊;
if(finally 塊正常執(zhí)行){
try 塊正常結(jié)束執(zhí)行;
else if(finally 塊由于原因 S 異常終止){
try 塊由于原因 S 異常終止;
}
}else if(catch 塊由于原因 R 異常終止){
執(zhí)行 finally 塊;
if(finally 塊正常執(zhí)行){
try 語(yǔ)句由于原因 R 異常終止;
}else if(finally 塊由于原因 S 異常終止){
try 語(yǔ)句由于原因 S 異常終止(原因 R 被忽略);
}
}
}else{
執(zhí)行 finally 塊;
if(finally 塊正常執(zhí)行完成){
try 語(yǔ)句拋出異常 v;
}else if (finally 塊由于原因 S 異常終止){
try 語(yǔ)句由于原因 S 異常終止; ( 異常 v 將被無視)
}
}
}else if(try 語(yǔ)句由于其他原因 R 異常終止){
execute finally block;
if(finally 塊正常執(zhí)行){
try 語(yǔ)句由于 R 而異常終止;
}else if(finally 塊由于原因 S 異常終止){
try 語(yǔ)句由于原因 S異常終止(原因 R 忽略掉);
}
}
// 英語(yǔ)原文
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);
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 人的一生,經(jīng)歷了出生、成長(zhǎng)、老年、死亡... 長(zhǎng)到每個(gè)人都要經(jīng)歷酸甜苦辣...但是同時(shí),它又那么短,短到只有幾個(gè)瞬...
    良心冷性閱讀 4,320評(píng)論 1 1
  • ?孩子:挑戰(zhàn)??無條件養(yǎng)育??非暴力溝通? 當(dāng)自己在做一件自認(rèn)為很值得的事情的時(shí)候 ,總是希望能得到別人的...
    慧如月閱讀 230評(píng)論 0 1
  • 我認(rèn)為我們單位一個(gè)最好的福利就是一年一度的體檢,體檢項(xiàng)目基本涵蓋了身體的各大器官,另外女工還有婦科的檢查,真的有好...
    我是仙兒閱讀 207評(píng)論 0 3
  • 作者:孔小姐 思考了很久標(biāo)題用哪一個(gè)更好,本來想用(別告訴我你想做什么,告訴我你做了什么,)想想還是現(xiàn)在這個(gè)更合適...
    後青年閱讀 672評(píng)論 4 3

友情鏈接更多精彩內(nèi)容