這兩天學到了異常機制,其中try...catch...finally個人覺得算是重要的一環,聯繫到之前學的語句,遇到了return和finally這個好玩的問題,經過試驗,發現計算機語言這種邏輯關係果然微妙,以下是自己的見解,若有不對之處,望各位前輩指點:
首先看第一段程式碼
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); } return i; } }
第一段程式碼輸出結果如下:
start
20
finally
20
請注意,此時第二個return是在finally語句外部,按照return與finally同時出現的規定,我們可以理解為第一個return只是一個條件,他的作用只是尋找finally語句,實際上只是執行了一個i+= 10的運算,然後直接進入finally語句,最後return回饋結果。
我們再看第二段程式碼:
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); return 50; } } }
第二段程式碼與第一段的差異只是將最後的return放到了finally語句當中,我們可以猜猜看輸出的結果:
start
20
finally
50
此時執行的return已經將先前運算結果所得的20覆蓋,並且返還了50這個數值,也就是說在finally語句中的return是執行了,呃,應該可以這樣說吧~~
還有第三段程式碼,大家慢慢享受:
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public static int m_1(){ int i=10; try{ System.out.println( "start" ); return i; }catch(Exception e){ System.out.println( "error: "+e ); }finally{ if(i>10){ System.out.println( i ); } System.out.println( "finally" ); i=50; } return i; }}
此時finally語句中多了i=50,那麼結果是什麼呢?
start
finally
10
這就是結果,finally語句中沒有return語句,那麼原來的回傳值就不會改變。
那麼透過這三個例子可不可以這樣理解:
碰到try語句中的return,先把值儲存到一個地方,然後尋找finally語句,如果語句中有新的演算法,就從那個空間取出這個值進行運算,finally中有return的話就就把「新值「覆蓋那個空間的“舊值”,並最終返回;如果finally中沒有return就直接將那個空間中的“舊值”取出來然後返還回去。
以上純屬理解,希望大家多指點,謝謝各位的幫忙!