Java中常見的異常分類,結合Spring的事務鞏固複習

菜鸟的奋斗之路發表於2024-10-10

Java異常的繼承關係是透過類繼承的方式構建的一個層次結構。以下是對Java異常繼承關係的詳細圖解說明:

異常類的頂層

  • Throwable:所有異常和錯誤的超類。

Throwable的子類

  • Error:通常是指與虛擬機器相關的問題,如系統崩潰、虛擬機器錯誤、動態連結失敗等,這種錯誤無法恢復或不可能捕獲,將導致應用程式中斷。應用程式通常不應試圖捕獲Error物件。
  • Exception:表示程式本身可以處理的異常。

Exception的子類

  • 執行時異常(RuntimeException):編譯器不要求強制處理的異常。常見的執行時異常包括NullPointerException(空指標異常)、IndexOutOfBoundsException(下標越界異常)、ArithmeticException(算術異常)等。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。
  • 非執行時異常(檢查異常,Checked Exception):編譯器要求必須處理的異常。常見的檢查異常包括IOException(輸入輸出異常)、SQLException(SQL異常)、ClassNotFoundException(類找不到異常)等。這些異常在編譯時就需要被捕獲或宣告丟擲。

異常繼承關係的圖解

由於無法直接在這裡繪製圖形,以下是用文字描述的異常繼承關係圖

Throwable  
├── Error  
└── Exception  
    ├── RuntimeException(執行時異常)  
    │   ├── NullPointerException  
    │   ├── IndexOutOfBoundsException  
    │   ├── ArithmeticException  
    │   └── ...(其他執行時異常)  
    └── (檢查異常,Checked Exception)  
        ├── IOException  
        │   └── FileNotFoundException  
        ├── SQLException  
        ├── ClassNotFoundException  
        └── ...(其他檢查異常)

異常處理的原則

  • 對於執行時異常,開發者應該透過編寫健壯的程式碼來儘量避免它們的出現,而不是依賴捕獲異常來處理它們。
  • 對於檢查異常,開發者必須在方法簽名中透過throws子句宣告可能會丟擲的異常,或者在方法內部使用try-catch語句塊來捕獲並處理這些異常。

常見的執行時異常(Runtime Exception)

執行時異常是在程式執行時可能發生的異常,它們通常是由程式中的邏輯錯誤或不當操作引發的。Java編譯器不會強制要求捕獲或宣告這些異常,但開發者應當透過編寫健壯的程式碼來儘量避免它們的出現。常見的執行時異常包括:

  1. NullPointerException:當應用程式試圖在需要物件的地方使用null時丟擲。
  2. IndexOutOfBoundsException:當索引超出字串或陣列的有效範圍時丟擲。例如,ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException
  3. ArithmeticException:當發生數學錯誤時丟擲,如除以零。
  4. ClassCastException:當試圖將物件強制轉換為不相容的類時丟擲。
  5. ArrayStoreException:當試圖將錯誤型別的物件儲存到陣列中時丟擲。
  6. BufferOverflowException:當向緩衝區寫入的資料超出其容量時丟擲。
  7. ConcurrentModificationException:當在不允許修改時(如在迭代過程中)修改集合時丟擲。

常見的檢查異常(Checked Exception)

檢查異常是在編譯時進行檢查的異常。如果方法可能丟擲檢查異常,但呼叫者沒有捕獲或宣告該異常,則編譯器會報錯。常見的檢查異常包括:

  1. IOException:當發生輸入輸出錯誤時丟擲,如讀寫檔案失敗。
  2. FileNotFoundException:當試圖開啟的檔案不存在時丟擲,是IOException的子類。
  3. SQLException:當訪問資料庫時發生SQL錯誤或資料訪問錯誤時丟擲。
  4. ClassNotFoundException:當應用程式試圖動態載入類(如在執行時使用Class.forName()方法)但找不到指定的類時丟擲。
  5. InterruptedException:當執行緒在等待、睡眠或嘗試加入另一個執行緒時被中斷時丟擲。
  6. ParseException:當嘗試將字串解析為日期或數字時格式不正確時丟擲,如SimpleDateFormatparse()方法可能丟擲此異常。

需要注意:當程式丟擲檢查異常時,Spring的事務管理 @Transactional 預設是不會生效的,需要著重注意,預設情況下只會捕獲:RuntimeException 和 Error 型別的異常,檢查異常需要捕獲處理時,就需要設定 rollbackFor 引數為:Exception 或者 Throwable 擴大事務的捕獲範圍!

相關文章