Java學習--異常處理及其應用類

忘塵天外天發表於2017-07-22

  異常是執行時在程式碼序列中引起的非正常狀況,換句話說,異常是執行時錯誤。在不支援異常處理的計算機語言中,必須手動檢查和處理錯誤----通常是通過使用錯誤程式碼,等等。這種方式既笨拙又麻煩。Java的異常處理避免了這些問題,並且在處理過程中採用物件導向的方式管理執行時錯誤。

1、異常處理的基礎概念

  Java異常是用來描述在一段程式碼中發生的異常情況(也就是錯誤)的物件。當出現引起異常的情況時,就會建立用來表示異常的物件,並在引起錯誤的方法中丟擲異常的物件。方法可以選擇自己處理異常,也可以繼續傳遞異常。無論採用哪種方式,在某一點都會捕獲並處理異常。異常可以由Java執行時系統生成,也可以通過程式碼手動生成。由Java丟擲的異常與那些違反Java語言規則或Java執行環境約束的基礎性錯誤有關。手動生成的異常通常用於向方法的呼叫者報告某些錯誤條件。

  Java異常處理通過5個關鍵字進行管理:try、catch、throw、throws和finally。它們的作用:在try程式碼塊中封裝可能發生異常的程式語句,對這些語句進行監視。如果在try程式碼塊中發生異常,就會將異常丟擲。程式碼可以(使用catch)捕獲異常,並以某些理性方式對其進行處理。系統生成的異常由Java執行時系統自動丟擲。為了手動丟擲異常,需要使用throw關鍵字。從方法丟擲的任何異常都必須通過一條throws語句進行指定。在try程式碼塊結束之後必須執行的所有程式碼塊都需要放入finally程式碼塊中。

  異常處理程式碼塊一般形式:         

    try{
    //block of code to moniter for errors
    }
    catch (ExceptionType1 e) {
    // exception handler for ExceptionType1
    }
    catch (ExceptionType2 e) {
    // exception handler for ExceptionType1
    }
    //.........
    finally{
    // block of code to be executed after try bloock ends
    }

  其中,ExceptionType2是已經發生的異常的型別。另外從JDK7開始,try語句增加一種支援自動資源管理的新形式,這種形式的try被稱為帶資源的try。

2、異常型別

  所有異常型別都是內建類Throwable的子類。因此,Throwable類位於異常類層次的頂部。緊隨Throwable之下的是兩個子類,他們將異常分為兩個不同 的分支。一個分支是Exception類,這個類既可以用於使用者程式應當捕獲的異常情況,也可以用於建立自定義異常型別的子類。Exception類有一個重要子類,名為RuntimeException類。對於編寫的程式而言,這種型別的異常是自動定義的,包括除零和無效陣列索引等情況。

  另外一個分支是Error類,該類定義了在常規環境下不希望由程式捕獲的異常。Error型別的異常由Java執行時系統使用,以指示執行時環境本身出現了某些錯誤。堆疊溢位是這類錯誤的一個例子,它們通常是為了響應災難性的失敗而建立的,程式通常不能處理這類異常。頂級的異常層次如圖

                                                                                             

3、throws/throw 關鍵字:

如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用 throws 關鍵字來宣告。throws 關鍵字放在方法簽名的尾部。也可以使用 throw 關鍵字丟擲一個異常,無論它是新例項化的還是剛捕獲到的。下面方法的宣告丟擲一個 RemoteException 異常:

      import java.io.*;

        public class className {

        public void deposit(double amount) throws RemoteException {

        // Method implementation throw new RemoteException();

        }

        //Remainder of class definition

        }

一個方法可以宣告丟擲多個異常,多個異常之間用逗號隔開。下面的方法宣告丟擲 RemoteException 和 InsufficientFundsException:

    import java.io.*;

    public class className {

      public void withdraw(double amount) throws RemoteException, InsufficientFundsException{

      // Method implementation

      }

    //Remainder of class definition

    }

4、finally關鍵字

finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。無論是否發生異常,finally 程式碼塊中的程式碼總會被執行。在 finally 程式碼塊中,可以執行清理型別等收尾善後性質的語句。

 

相關文章