異常的處理方式之一:捕獲異常


捕獲異常是通過3個關鍵詞來實現的:try-catch-finally。用try來執行一段程序,如果出現異常,系統拋出一個異常,可以通過它的類型來捕捉(catch)並處理它,最后一步是通過finally語句為異常處理提供一個統一的出口,finally所指定的代碼都要被執行(catch語句可有多條;finally語句最多只能有一條,根據自己的需要可有可無)。如圖所示。

圖6-10 異常處理.png

 

上面過程詳細解析:

1. try:

      try語句指定了一段代碼,該段代碼就是異常捕獲並處理的范圍。在執行過程中,當任意一條語句產生異常時,就會跳過該條語句中后面的代碼。代碼中可能會產生並拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理。

      一個try語句必須帶有至少一個catch語句塊或一個finally語句塊 。

注意事項

      當異常處理的代碼執行結束以后,不會回到try語句去執行尚未執行的代碼。

2. catch:

      n-每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同類型的異常對象。

      n-常用方法,這些方法均繼承自Throwable類 。

          u-toString ()方法,顯示異常的類名和產生異常的原因

          u-getMessage()方法,只顯示產生異常的原因,但不顯示類名。

          u-printStackTrace()方法,用來跟蹤異常事件發生時堆棧的內容。

      n-catch捕獲異常時的捕獲順序:

          u-如果異常類之間有繼承關系,在順序安排上需注意。越是頂層的類,越放在下面,再不然就直接把多余的catch省略掉。 也就是先捕獲子類異常再捕獲父類異常。

2. finally:

      n-有些語句,不管是否發生了異常,都必須要執行,那么就可以把這樣的語句放到finally語句塊中。

      n-通常在finally中關閉程序塊已打開的資源,比如:關閉文件流、釋放數據庫連接等。

try-catch-finally語句塊的執行過程:

      try-catch-finally程序塊的執行流程以及執行結果比較復雜。

      基本執行過程如下:

      程序首先執行可能發生異常的try語句塊。如果try語句沒有出現異常則執行完后跳至finally語句塊執行;如果try語句出現異常,則中斷執行並根據發生的異常類型跳至相應的catch語句塊執行處理。catch語句塊可以有多個,分別捕獲不同類型的異常。catch語句塊執行完后程序會繼續執行finally語句塊。finally語句是可選的,如果有的話,則不管是否發生異常,finally語句都會被執行。

注意事項

    1. 即使try和catch塊中存在return語句,finally語句也會執行。是在執行完finally語句后再通過return退出。

    2. finally語句塊只有一種情況是不會執行的,那就是在執行finally之前遇到了System.exit(0)結束程序運行。

【示例】典型代碼(先不要敲!!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import  java.io.FileNotFoundException;
import  java.io.FileReader;
import  java.io.IOException;
public  class  Test8 {
     public  static  void  main(String[] args) {
         FileReader reader =  null ;
         try  {
             reader =  new  FileReader( "d:/a.txt" );
             char  c = ( char ) reader.read();
             char  c2 = ( char ) reader.read();
             System.out.println( ""  + c + c2);
         catch  (FileNotFoundException e) {
             e.printStackTrace();
         catch  (IOException e) {
             e.printStackTrace();
         finally  {
             try  {
                 if  (reader !=  null ) {
                     reader.close();
                 }
             catch  (Exception e) {
                 e.printStackTrace();
             }
         }
     }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM