編譯時異常與執行時異常的區別
阿新 • • 發佈:2018-12-01
Java異常類層次結構圖
Java異常類層次結構圖
- 執行時異常:都是
RuntimeException
類及其子類異常,如NullPointerException
(空指標異常)、IndexOutOfBoundsException
(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。
執行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch
語句捕獲它,也沒有用throws
子句宣告丟擲它,也會編譯通過。 - 非執行時異常 (編譯異常)
RuntimeException
以外的異常,型別上都屬於Exception
類及其子類。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如IOException
、SQLException
等以及使用者自定義的Exception異常,一般情況下不自定義檢查異常。
摘錄:
在 Java 中,所有的異常都有一個共同的祖先
Throwable
(可丟擲)。Throwable
指定程式碼中可用異常傳播機制通過 Java 應用程式傳輸的任何問題的共性。
Throwable
: 有兩個重要的子類:Exception
(異常)和Error
(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。
Error
(錯誤):是程式無法處理的錯誤,表示執行應用程式中較嚴重問題。大多數錯誤與程式碼編寫者執行的操作無關,而表示程式碼執行時 JVM(Java 虛擬機器)出現的問題。例如,Java虛擬機器執行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的記憶體資源時,將出現OutOfMemoryError
。這些異常發生時,Java虛擬機器(JVM)一般會選擇執行緒終止。
。這些錯誤表示故障發生於虛擬機器自身、或者發生在虛擬機器試圖執行應用時,如Java虛擬機器執行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError
- Exception(異常):是程式本身可以處理的異常。
Exception
類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發的錯誤。例如,若試圖使用空值物件引用、除數為零或陣列越界,則分別引發執行時異常(NullPointerException
、ArithmeticException
)和ArrayIndexOutOfBoundException
。 - 注意:異常和錯誤的區別:異常能被程式本身可以處理,錯誤是無法處理。
- 通常,Java的異常(包括
Exception
和Error
)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。 - 可查異常(編譯器要求必須處置的異常):正確的程式在執行中,很容易出現的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發生是可以預計的,而且一旦發生這種異常狀況,就必須採取某種方式進行處理。
- 除了
RuntimeException
及其子類以外,其他的Exception
類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程式中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句宣告丟擲它,否則編譯不會通過。 - 不可查異常(編譯器不要求強制處置的異常):包括執行時異常(
RuntimeException
與其子類)和錯誤(Error
)。 Exception
這種異常分兩大類執行時異常和非執行時異常(編譯異常)。程式中應當儘可能去處理這些異常。