分類:
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
Java中try,catch,finally的用法,以前感覺還算熟悉,但看到一篇博文才有更深點的理解,總結網友博客如下。
Java異常處理的組合方式:
1.try+catch運行流程:運行到try塊中,如果有異常拋出,則轉到catch塊去處理。然後執行catch塊後面的語句
2.try+catch+finally
運行流程:運行到try塊中,如果有異常拋出,則轉到catch塊,catch塊執行完畢後,執行finally塊的代碼,再執行finally塊後面的代碼。如果沒有異常拋出,執行完try塊,也要去執行finally塊的代碼。然後執行finally塊後面的語句
3.try+finally運行流程:運行到try塊中,如果有異常拋出的話,程序轉向執行finally塊的代碼。那末finally塊後面的代碼還會被執行嗎?不會!因爲你沒有處理異常,所以遇到異常後,執行完finally後,方法就以拋出異常的方式退出。
這種方式中要注意的是,由於你沒有捕獲異常,所以要在方法後面聲明拋出異常。
共同點:
1.在catch塊和finally塊中仍然可以再拋出新的異常
例如 throw new Exception("illegal invoked");
如果對於新拋出的異常沒有寫try的話,則要在方法後面聲明拋出異常
反之,如果給catch塊或finally塊裏的異常再套上一層try,catch的話,方法後面就不必聲明異常了。
問題:try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後?
我們來看下面代碼:
- public class Test {
- /**
- * @param args add by zxx ,Dec 9, 2008
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- System.out.println(new Test().test());;
- }
- static int test()
- {
- int x = 1;
- try
- {
- return x;
- }
- finally
- {
- ++x;
- }
- }
- }
1
- public class smallT
- {
- public static void main(String args[])
- {
- smallT t = new smallT();
- int b = t.get();
- System.out.println(b);
- }
- public int get()
- {
- try
- {
- return 1 ;
- }
- finally
- {
- return 2 ;
- }
- }
- }
2
- public class Test {
- /**
- * @param args add by zxx ,Dec 9, 2008
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- System.out.println(new Test().test());;
- }
- int test()
- {
- try
- {
- return func1();
- }
- finally
- {
- return func2();
- }
- }
- int func1()
- {
- System.out.println("func1");
- return 1;
- }
- int func2()
- {
- System.out.println("func2");
- return 2;
- }
- }
func1
func2
2
分析:
從上面3個例子的運行結果中可以發現,try中的return語句調用的函數先於finally中調用的函數執行,也就是說return語句先執行,finally語句後執行。Return並不是讓函數馬上返回,而是return語句執行後,將把返回結果放置進函數棧中,此時函數並不是馬上返回,它要執行finally語句後才真正開始返回。