1. 程式人生 > >Android面試之java基礎try-catch-finally-return的執行先後順序問題

Android面試之java基礎try-catch-finally-return的執行先後順序問題

還是一個被個程式猿們討論多時的問題,也是眾軟體公司面試題中很鍾情的一個問題,更是一個考查程式猿對Java基礎知識掌握理解程度的問題,就是本文要說的try-catch-finally-return的執行先後順序問題

先說明幾個原則 。

1、不論是否能捕捉到異常,finally塊中程式碼都會執行;

2、當try和catch中有return時,finally仍然會執行;

3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的值儲存起來,管finally中的程式碼怎麼樣,返回的值都不會改變,任然是之前儲存的值),所以函式返回值是在finally執行前確定的;

4、finally中最好不要包含return,否則程式會提前退出,返回值不是try或catch中儲存的返回值。

執行測試程式碼,看事實真相。

下面是一段很簡單卻又很有研究價值的程式碼段。

private static int doPrint() { try { int x = 5 / 1; System.out.println("sleep"); int y = 5 / 0; return 0; } catch (Exception e) { // TODO: handle exception System.err.println("err"); System.out.println("exception"); return 1; } finally { System.out.println("finally"); return 2; } } 根據try-catch-finally-return的一般特性,可把try-catch-finally-return執行順序分為以下六種情況。 下面分情況逐一分析,說明。 情況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;          程式先執行try,如果遇到異常執行catch塊,          有異常:則執行catch中return之前(包括return語句中的表示式運算)程式碼,再執行finally語句中全部程式碼,                      最後執行catch塊中return. finally之後也就是4處的程式碼不再執行          無異常:執行完try再finally再return. 情況4:try{ return; }catch(){} finally{return;}           程式執行try塊中return之前(包括return語句中的表示式運算)程式碼;           再執行finally塊,因為finally塊中有return所以提前退出。 情況5:try{} catch(){return;}finally{return;}           程式執行catch塊中return之前(包括return語句中的表示式運算)程式碼;           再執行finally塊,因為finally塊中有return所以提前退出。 情況6:try{ return;}catch(){return;} finally{return;}           程式執行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。 本文轉載自http://blog.csdn.net/kavensu/article/details/8067850。感謝原作者。