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

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

先來看看異常的結構圖,建議你結合JDK一塊兒看。面試

 

 


 

能夠看出異常的家族勢力龐大,一般咱們說的異常是包括exception和error。編程

 

Exception家族咱們恐怕見的很多,可是error家族咱們可能就沒什麼印象了,下面我來講說這兩個類的區別:數組

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

我的理解:出現Error錯誤通常不是因爲你編寫的代碼出現問題,而是因爲JVM運行你這段代碼出現了問題,好比堆溢出,配置文件出錯等,這些你是沒法人爲的在你代碼裏能夠保證的,必需要額外的去操做,從新配置虛擬機,修改配置文件等等。spa

Exception(異常):是程序自己能夠處理的異常。也就是你常見的空指針異常(NullPointerException),數組超出範圍異常(IndexOutOfBoundsException)等等。.net

 

一般,Java的異常(包括Exception和Error)分爲檢查異常(checked exceptions)和非檢查的異常(unchecked exceptions)。線程

 

1、檢查異常(checked exceptions)設計

什麼是檢查異常?3d

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

對檢查異常(checked exception)的幾種處理方式:
一、繼續拋出,消極的方法,一直能夠拋到java虛擬機來處理,就是經過throws exception拋出。
二、用try...catch捕獲
注意,對於檢查的異常必須處理,或者必須捕獲或者必須拋出

 

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

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

 

2、非檢查異常(unchecked exceptions)

什麼是非檢查異常?

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

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

通常咱們是不處理的,由於你很難判斷會出什麼問題,並且有些異常你也沒法運行時處理,好比空指針,須要人手動的去查找。

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

 

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

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

 

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

剛纔咱們是從Exception和Error總體來劃分的,如今咱們能夠對Exception異常進行劃分,它可分爲運行時異常和非運行時異常。

1、運行時異常

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

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

2、非運行時異常

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

 

參考文獻:

深刻理解java異常處理機制

檢查異常和未檢查異常不一樣之處

相關文章
相關標籤/搜索