1. 程式人生 > >java異常—檢查異常(checked exception)和未檢查異常(unchecked exception)

java異常—檢查異常(checked exception)和未檢查異常(unchecked exception)

處理 角度 查找 targe 什麽是 mem 出錯 邏輯 alt

網易面試要我畫異常的結構圖,什麽是檢查異常,什麽是非檢查異常,我當時的表情是這樣的,技術分享。我看過,忘了。沒辦法,繼續看,寫博客掌握。

先來看看異常的結構圖,建議你結合JDK一起看。

技術分享


可以看出異常的家族勢力龐大,通常我們說的異常是包括exceptio和error。

Exception家族我們恐怕見的不少,但是error家族我們可能就沒什麽印象了,下面我來說說這兩個類的區別:

Error(錯誤):是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數的錯誤與代碼編寫者執行的操作無關,而是表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之外,而且絕大多數是程序運行時不允許出現的狀況。對於設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在 Java中,錯誤通過Error的子類描述。

個人理解:出現Error錯誤一般不是由於你編寫的代碼出現問題,而是由於JVM運行你這段代碼出現了問題,比如堆溢出,配置文件出錯等,這些你是無法人為的在你代碼裏可以保證的,必須要額外的去操作,重新配置虛擬機,修改配置文件等等。

Exception(異常):是程序本身可以處理的異常。也就是你常見的空指針異常(NullPointerException),數組超出範圍異常(IndexOutOfBoundsException)等等。

通常,Java的異常(包括Exception和Error)分為檢查異常(checked exceptions)和非檢查的異常(unchecked exceptions)。

一、檢查異常(checked exceptions)

什麽是檢查異常?

答:就是編譯器要求你必須處置的異常。不知道你編程的時候有沒有遇到過,你寫的某段代碼,編譯器要求你必須要對這段代碼try...catch,或者throws exception,如果你遇見過,沒錯,這就是檢查異常,也就是說,你代碼還沒運行呢,編譯器就會檢查你的代碼,會不會出現異常,要求你對可能出現的異常必須做出相應的處理。

對檢查異常(checked exception)的幾種處理方式:
1、繼續拋出,消極的方法,一直可以拋到java虛擬機來處理,就是通過throws exception拋出。
2、用try...catch捕獲


註意,對於檢查的異常必須處理,或者必須捕獲或者必須拋出

如何區分什麽是檢查異常呢?

除了RuntimeException與其子類,以及錯誤(Error),其他的都是檢查異常(絕對的大家族)。

二、非檢查異常(unchecked exceptions)

什麽是非檢查異常?

答:編譯器不要求強制處置的異常,雖然你有可能出現錯誤,但是我不會在編譯的時候檢查,沒必要,也不可能。為什麽呢?你想想非檢查異常都有哪些?NullPointerException,IndexOutOfBoundsException,VirtualMachineError等,這些異常你編譯的時候檢查嗎?那我還要不要運行了,等死人啊。再說了,明明可以運行時檢查,都在編譯的時候檢查,你寫的代碼還能看嗎?而且有些異常只能在運行時才能檢查出來,比如空指針,堆溢出等。

對未檢查的異常(unchecked exception )的幾種處理方式:
1、捕獲
2、繼續拋出
3、不處理

一般我們是不處理的,因為你很難判斷會出什麽問題,而且有些異常你也無法運行時處理,比如空指針,需要人手動的去查找。

而且,捕捉異常並處理的代價遠遠大於直接拋出。

如何區分什麽是非檢查異常呢?

RuntimeException與其子類,以及錯誤(Error)。

順便說一下運行時異常和非運行時異常。

剛才我們是從Exception和Error整體來劃分的,現在我們可以對Exception異常進行劃分,它可分為運行時異常和非運行時異常。

一、運行時異常

都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是非檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

二、非運行時異常

是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不要自定義檢查異常。

參考文獻:

深入理解java異常處理機制

檢查異常和未檢查異常不同之處

java異常—檢查異常(checked exception)和未檢查異常(unchecked exception)