try..catch..finally這個語法大家都很熟悉,就是捕捉異常、處理異常,面試中經常被問到的一個問題是:如果在try...catch中的某某地方return了,那么之后的某某步驟還會不會執行。今天就來用代碼分析一下各種可能的執行情況,懶得看文章的話,直接看最后的總結,如果不明白再回頭看文章。
1.首先要明確一個,在finally里面是不能執行return語句的,如果在finally中使用了return,則會提示這樣的錯誤:“控制不能離開 finally子句主體”。如圖1:

圖1
2.只有try中有return語句
當一個捕捉異常語句中只有try語句中有return時,如下代碼:
private string tryFun(int num) { int result = 0; try { result = 10 / num; return "1"; } catch { } finally { } return "-2"; }
如果這時候num的值為0,則會出現除0的異常,則return “1”不執行,而去執行catch,因為此時假設只有try中有return語句,所以當catch執行完之后將會執行函數最后的return “-2”語句;如果try語句塊中沒有異常,則return "-2"語句不執行。
3.只有catch中有return語句
當一個捕捉異常語句中只有catch語句中有return時,如下代碼:
private string tryFun(int num) { int result = 0; try { result = 10 / num; } catch { return "-1"; } finally { } return "-2"; }
如果這時候num的值為0,則會出現除0的異常,則去執行catch,因為此時假設只有catch中有return語句,所以當catch執行完之后直接return “-1”,就不執行finally之后的語句(finally塊中的語句肯定是會執行的),也就是在這里return “-2”語句不執行。
4.當try...catch中都有return語句
當try...catch中都有return語句,代碼如下:
private string tryFun(int num) { int result = 0; try { result = 10 / num; return "try"; } catch { return "catch"; } finally { } return "-2"; }
這時,不管執行的是try還是catch中的語句,return “-2”永遠都不執行,也就是finally之后的語句都不執行了(finally里面的語句肯定還是執行啦)。
總結:不管是執行try還是catch,finally中的語句肯定是會執行的;不管是執行try還是catch,如果所執行的語句中(try和catch中的return只有一個會執行,如果被catch了,肯定是執行catch語句中的return;如果沒有被catch,那肯定是執行try中的return。這里假設它們中有return,如果沒有return,肯定會執行finally后面的語句)有return語句,則finally之后的語句就不執行(finally里面的語句肯定還是執行啦);如果是執行try或catch中的語句塊沒有return語句,則finally后面的語句還是會執行的。
