在面試的時候,經常會問到一些很基礎的知識,比如有沒接觸過try,catch,finally?他們的執行順序是怎麼樣的呢?你對此嗤之以鼻,這不是很簡單嗎?按照順序執就行了。沒錯,可是如果每一塊有return,并且有抛異常,撲捉異常的情況呢?估計很多 人都答不上來。下面我列出try,catch,finally的各種情況,然後總結一招搞定try,catch,finally的執行順序。

舉例:
- 情況1: try{} catch(){}finally{} return;
顯然程式按順序執行。
- 情況2: try{ return; }catch(){} finally{} return;
先執行try塊中return 語句(包括return語句中的表達式運算),但不傳回;
執行finally語句中全部代碼
最後執行try中return 傳回
finally塊之後的語句return不執行,因為程式在try中已經return。
- 情況3: try{ } catch(){return;} finally{} return;
1、程式先執行try,如果遇到異常執行catch塊,
有異常:
執行catch中return語句,但不傳回
執行finally語句中全部代碼,
最後執行catch塊中return傳回。 finally塊後的return語句不再執行。
無異常:
執行完try再finally再return…
- 情況4: try{ return; }catch(){} finally{return;}
執行try塊return語句(包括return語句中的表達式運算),但不傳回;
再執行finally塊,
執行finally塊,有return,從這裡傳回。
此時finally塊的return值,就是代碼執行完後的值
- 情況5: try{} catch(){return;}finally{return;}
程式執行catch塊中return語句(包括return語句中的表達式運算),但不傳回;
再執行finally塊,執行finally塊,有return,從這裡傳回。
- 情況6: try{ return;}catch(){return;} finally{return;}
1、程式執行try塊中return語句(包括return語句中的表達式運算),但不傳回;
有異常:
執行catch塊中return語句(包括return語句中的表達式運算),但不傳回;
再執行finally塊
執行finally塊,有return,從這裡傳回。
無異常:
再執行finally塊
執行finally塊,有return,從這裡傳回。
最終結論:
任何執行try 或者catch中的return語句之後,在傳回之前,如果finally存在的話,都會先執行finally語句,如果finally中有return語句,那麼程式就return了,是以finally中的return是一定會被return的,編譯器把finally中的return實作為一個warning。