Java中try,catch,finally的用法

 

Java中try,catch,finally的用法

標籤: Javatrycatchfinally用法
 11635人閱讀 評論(0) 收藏 舉報
 分類:

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前還是後? 

我們來看下面代碼:

[java] view plain copy
  1. public  class Test {  
  2.   
  3.     /** 
  4.      * @param args add by zxx ,Dec 9, 2008 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(new Test().test());;  
  9.     }  
  10.   
  11.     static int test()  
  12.     {  
  13.         int x = 1;  
  14.         try  
  15.         {  
  16.             return x;  
  17.         }  
  18.         finally  
  19.         {  
  20.             ++x;  
  21.         }  
  22.     }  
  23.       
  24. }  
---------執行結果 ---------
1

[java] view plain copy
  1. public class  smallT  
  2. {  
  3.     public static void  main(String args[])  
  4.     {  
  5.         smallT t  = new  smallT();  
  6.         int  b  =  t.get();  
  7.         System.out.println(b);  
  8.     }  
  9.       
  10.     public int  get()  
  11.     {  
  12.         try  
  13.         {  
  14.             return 1 ;  
  15.         }  
  16.         finally  
  17.         {  
  18.             return 2 ;  
  19.         }  
  20.     }  
  21. }  
---------執行結果 ---------
2

[java] view plain copy
  1. public  class Test {  
  2.   
  3.     /** 
  4.      * @param args add by zxx ,Dec 9, 2008 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(new Test().test());;  
  9.     }  
  10.   
  11.     int test()  
  12.     {  
  13.         try  
  14.         {  
  15.             return func1();  
  16.         }  
  17.         finally  
  18.         {  
  19.             return func2();  
  20.         }  
  21.     }  
  22.       
  23.     int func1()  
  24.     {  
  25.         System.out.println("func1");  
  26.         return 1;  
  27.     }  
  28.     int func2()  
  29.     {  
  30.         System.out.println("func2");  
  31.         return 2;  
  32.     }     
  33. }  
-----------執行結果-----------------
func1
func2
2


分析:

從上面3個例子的運行結果中可以發現,try中的return語句調用的函數先於finally中調用的函數執行,也就是說return語句先執行,finally語句後執行。Return並不是讓函數馬上返回,而是return語句執行後,將把返回結果放置進函數棧中,此時函數並不是馬上返回,它要執行finally語句後才真正開始返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章