淺談Java異常處理機制
前言
??在 Java 中,異常被當作對象來處理,所有的異常都有一個共同的祖先java.lang.Throwable類。Throwable有兩個重要的子類Exception(異常) 和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。先從整體看看異常類層次結構圖,使我們對異常體系有一個大概的認識:

Java異常類層次結構圖,來源于參考文獻1.
??Error:是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
??Exception:是程序本身可以處理的異常,它有一個重要的子類 RuntimeException。RuntimeException 異常由Java虛擬機拋出,主要指編碼、環境或者用戶操作輸入出現問題。
??注意,異常和錯誤的區別:異常能被程序本身處理,錯誤是無法處理的。使用try-catch-finally捕獲異常,其捕獲語法如下:
try {
需要被檢測的代碼;
} catch(異常類 變量名) {
異常處理代碼;
} fianlly {
一定會執行的代碼;
}
異常分類
??總體上我們根據Javac對異常的處理要求,將異常類分為2類,即非受檢查異常和受檢查異常。
??不受檢查異常(unckecked exception):Error 和 RuntimeException 以及它們的子類。javac在編譯時,不會提示和發現這樣的異常,不要求在程序中處理這些異常。此類異常的出現常常是代碼本身有問題造成的,應該從業務邏輯層面去解決并改進代碼,而不是去通過異常處理機制解決。如分母為零的算術異常ArithmeticException,使用了空對象NullPointerException等等。
??受檢查異常(checked exception):除了 Error 和 RuntimeException的其它異常。javac強制要求程序員處理這樣的異常,要么用try-catch語句捕獲,要么用throws子句聲明拋出;否則,直接導致編譯失敗。這樣的異常一般是由程序的運行環境導致的,因為程序可能被運行在各種未知的環境下,而程序員無法干預用戶如何使用這些程序,于是就應該為這樣的異常時刻準備著如FileNotFoundException 等。
??需要明確的是:受檢查和非受檢查是對于javac來說的,這樣就很好理解和區分了。
常見異常及其分類
??面試官也可能讓你舉出幾個常見的異常情況并將其分類,未雨綢繆,下面列出了一些 Java 中常見的異常及其分類。
RuntimeException
-
數組下標越界異常 ArrayIndexOutOfBoundsException;
-
空指針異常 NullPointerException;
-
類型轉換異常 ClassCastException;
-
非法參數異常 IllegalArgumentException。
UncheckedException
- 指定變量不存在異常 NoSuchFieldException 。
常見問題
-
Excption與Error的關系是什么?
Excption與Error都是Throwable的子類。
Error和Exception的區別:Error通常是災難性的、致命的錯誤,是程序無法控制和處理的。當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程。Exception通常情況下是可以被程序處理的,并且在程序中應該盡可能的捕獲這些異常。 -
如何自定義一個異常?
通過繼承一個異常類自定義異常,運行時異常繼承 RuntimeException,編譯時異常繼承 Exception。 -
try-catch-finally,try中有return,finally還執行嗎?
執行。finally代碼塊的執行在return之前,不管try中是否有異常,它都執行。溫馨提示,如果finally中有return,則會在try的return之前執行,導致不執行try中的return。 -
throw 和throws關鍵字的區別
throw用于在函數內拋出異常對象,后面跟的是異常對象。
throws用于在方法聲明上拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。
??例如:
static void demoException() throws Exception {
throw new Exception("error msg");
}
- 舉個內存溢出的例子
public static void main(String[] args) {
//java.lang.OutOfMemoryError 內存溢出錯誤
byte[] buf = new byte[1024*1024*700];
}
小結
??以上就是這篇文章的全部內容了,希望本文對大家的學習或者工作能帶來一定的幫助,如有疑問請留言交流。Wiener在此祝各位生活愉快!工作順利!
Reference
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號