在程式設計和執行的過程中,發生錯誤是不可避免的。儘管 Java 語言的設計從根本上提供了便於寫出整潔、安全程式碼的方法,並且程式設計師也儘量地減少錯誤的產生,但是使程式被迫停止的錯誤的存在仍然不可避免。為此,Java 提供了異常處理機制來幫助程式設計師檢查可能出現的錯誤,以保證程式的可讀性和可維護性
異常(Exception)
異常(Exception)又稱為例外,是一個在程式執行期間發生的事件,它中斷正在執行的程式的正常指令流。為了能夠及時有效地處理程式中的執行錯誤,必須使用異常類。錯誤可能產生於程式設計師沒有預料到的各種情況,或者超出程式設計師可控範圍的環境,例如使用者的壞資料、試圖開啟一個不存在的檔案等。為了能夠及時有效地處理程式中的執行錯誤,Java 專門引入了異常類
異常原因
一、Java 內部錯誤發生異常,Java 虛擬機器產生的異常。
二、編寫的程式程式碼中的錯誤所產生的異常,例如空指標異常、陣列越界異常等。這種異常稱為未檢査的異常,一般需要在某些類中集中處理這些異常。
三、通過 throw 語句手動生成的異常,這種異常稱為檢査的異常,一般用來告知該方法的呼叫者一些必要的資訊。
Java 通過物件導向的方法來處理異常。在一個方法的執行過程中,如果發生了異常,則這個方法會產生代表該異常的一個物件,並把它交給執行時的系統,執行時系統尋找相應的程式碼來處理這一異常。我們把生成異常物件,並把它提交給執行時系統的過程稱為丟擲(throw)異常。執行時系統在方法的呼叫棧中查詢,直到找到能夠處理該型別異常的物件,這一個過程稱為捕獲(catch)異常。
異常型別
在 Java 中所有異常型別都是內建類 java.lang.Throwable 類的子類,即 Throwable 位於異常類層次結構的頂層。Throwable 類下有兩個異常分支 Exception 和 Error
Throwable 類是所有異常和錯誤的超類,下面有 Error 和 Exception 兩個子類分別表示錯誤和異常。其中異常類 Exception 又分為執行時異常和非執行時異常,這兩種異常有很大的區別,也稱為不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)
Exception 類用於使用者程式可能出現的異常情況,它也是用來建立自定義異常型別類的類。
Error 定義了在通常環境下不希望被程式捕獲的異常。Error 型別的異常用於 Java 執行時由系統顯示與執行時系統本身有關的錯誤。堆疊溢位是這種錯誤
執行時異常都是 RuntimeException 類及其子類異常,如 NullPointerException、IndexOutOfBoundsException 等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般由程式邏輯錯誤引起,程式應該從邏輯角度儘可能避免這類異常的發生
非執行時異常是指 RuntimeException 以外的異常,型別上都屬於 Exception 類及其子類。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如 IOException、ClassNotFoundException 等以及使用者自定義的 Exception 異常,一般情況下不自定義檢查異常。表 1 列出了一些常見的異常型別及它們的作用
常見的異常型別
Exception 異常層次結構的根類
RuntimeException 執行時異常,多數 java.lang 異常的根類
ArithmeticException 算術譜誤異常,如以零做除數
ArraylndexOutOfBoundException 陣列大小小於或大於實際的陣列大小
NullPointerException 嘗試訪問 null 物件成員,空指標異常
ClassNotFoundException 不能載入所需的類
NumberF ormatException 數字轉化格式異常,比如字串到 float 型數字的轉換無效
IOException I/O 異常的根類
F ileN otF oundException 找不到檔案
EOFException 檔案結束
InterruptedException 執行緒中斷
IllegalArgumentException 方法接收到非法引數
ClassCastException 型別轉換異常
SQLException 運算元據庫異常
異常處理
異常處理通過 5 個關鍵字來實現:try、catch、throw、throws 和 finally。try catch 語句用於捕獲並處理異常,finally 語句用於在任何情況下(除特殊情況外)都必須執行的程式碼,throw 語句用於丟擲異常,throws 語句用於宣告可能會出現的異常。在方法中用 try catch 語句捕獲並處理異常,catch 語句可以有多個,用來匹配多個異常。
對於處理不了的異常或者要轉型的異常,在方法的宣告處通過 throws 語句丟擲異常,即由上層的呼叫方法來處理
try{
//邏輯程式塊
}
catch(ExceptionType1 e){
//處理程式碼塊1
}
catch (ExceptionType2 e){
//處理程式碼塊2
throw(e); //再丟擲這個"異常"
}
finally{
//釋放資原始碼塊
}
自定義異常
如果 Java 提供的內建異常型別不能滿足程式設計的需求,可以設計自己的異常型別。自定義異常類必須繼承現有的 Exception 類或 Exception 的子類來建立,其語法形式為
<class><自定義異常名><extends><Exception>
自定義異常類一般包含兩個構造方法:一個是無參的預設構造方法,另一個構造方法以字串的形式接收一個定製的異常訊息,並將該訊息傳遞給超類的構造方法。
public class MyException extends Exception
{
public MyException()
{
super();
}
public MyException(String str)
{
super(str);
}
}
//使用
throw new MyException("異常資訊!");