1. 程式人生 > >java 常用的異常處理

java 常用的異常處理

在Java中異常被當做物件來處理,根類是java.lang.Throwable類,在Java中定義了很多異常類(如OutOfMemoryError、NullPointerException、IndexOutOfBoundsException等),這些異常類分為兩大類:Error和Exception。

  Error是無法處理的異常,比如OutOfMemoryError,一般發生這種異常,JVM會選擇終止程式。因此我們編寫程式時不需要關心這類異常。

  Exception,也就是我們經常見到的一些異常情況,比如NullPointerException、IndexOutOfBoundsException,這些異常是我們可以處理的異常。

  Exception類的異常包括checked exception和unchecked exception(unchecked exception也稱執行時異常RuntimeException,當然這裡的執行時異常並不是前面我所說的執行期間的異常,只是Java中用執行時異常這個術語來表示,Exception類的異常都是在執行期間發生的)。

  unchecked exception(非檢查異常),也稱執行時異常(RuntimeException),比如常見的NullPointerException、IndexOutOfBoundsException。對於執行時異常,java編譯器不要求必須進行異常捕獲處理或者丟擲宣告,由程式設計師自行決定。

  checked exception(檢查異常),也稱非執行時異常(執行時異常以外的異常就是非執行時異常),java編譯器強制程式設計師必須進行捕獲處理,比如常見的IOExeption和SQLException。對於非執行時異常如果不進行捕獲或者丟擲宣告處理,編譯都不會通過。

   1)對程式碼塊用try..catch進行異常捕獲處理;

  2)在 該程式碼的方法體外用throws進行丟擲宣告,告知此方法的呼叫者這段程式碼可能會出現這些異常,你需要謹慎處理。此時有兩種情況:

    如果宣告丟擲的異常是非執行時異常,此方法的呼叫者必須顯示地用try..catch塊進行捕獲或者繼續向上層丟擲異常。

    如果宣告丟擲的異常是執行時異常,此方法的呼叫者可以選擇地進行異常捕獲處理。

  3)在程式碼塊用throw手動丟擲一個異常物件,此時也有兩種情況,跟2)中的類似:

    如果丟擲的異常物件是非執行時異常,此方法的呼叫者必須顯示地用try..catch塊進行捕獲或者繼續向上層丟擲異常。

    如果丟擲的異常物件是執行時異常,此方法的呼叫者可以選擇地進行異常捕獲處理。

  (如果最終將異常拋給main方法,則相當於交給jvm自動處理,此時jvm會簡單地列印異常資訊)

       try關鍵字用來包圍可能會出現異常的邏輯程式碼,它單獨無法使用,必須配合catch或者finally使用。Java編譯器允許的組合使用形式只有以下三種形式:

  try...catch...;       try....finally......;    try....catch...finally...

  當然catch塊可以有多個,注意try塊只能有一個,finally塊是可選的(但是最多隻能有一個finally塊)。

  三個塊執行的順序為try—>catch—>finally。

  當然如果沒有發生異常,則catch塊不會執行。但是finally塊無論在什麼情況下都是會執行的(這點要非常注意,因此部分情況下,都會將釋放資源的操作放在finally塊中進行)。

  在有多個catch塊的時候,是按照catch塊的先後順序進行匹配的,一旦異常型別被一個catch塊匹配,則不會與後面的catch塊進行匹配。

  在使用try..catch..finally塊的時候,注意千萬不要在finally塊中使用return,因為finally中的return會覆蓋已有的返回值。

     1)父類的方法沒有宣告異常,子類在重寫該方法的時候不能宣告異常;

  2)如果父類的方法宣告一個異常exception1,則子類在重寫該方法的時候宣告的異常不能是exception1的父類;

  3)如果父類的方法宣告的異常型別只有非執行時異常(執行時異常),則子類在重寫該方法的時候宣告的異常也只能有非執行時異常(執行時異常),不能含有執行時異常(非執行時異常)。