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編譯器不會強制要求捕獲或宣告這些異常,但開發者應當透過編寫健壯的程式碼來儘量避免它們的出現。常見的執行時異常包括:
- NullPointerException:當應用程式試圖在需要物件的地方使用
null
時丟擲。 - IndexOutOfBoundsException:當索引超出字串或陣列的有效範圍時丟擲。例如,
ArrayIndexOutOfBoundsException
和StringIndexOutOfBoundsException
。 - ArithmeticException:當發生數學錯誤時丟擲,如除以零。
- ClassCastException:當試圖將物件強制轉換為不相容的類時丟擲。
- ArrayStoreException:當試圖將錯誤型別的物件儲存到陣列中時丟擲。
- BufferOverflowException:當向緩衝區寫入的資料超出其容量時丟擲。
- ConcurrentModificationException:當在不允許修改時(如在迭代過程中)修改集合時丟擲。
常見的檢查異常(Checked Exception)
檢查異常是在編譯時進行檢查的異常。如果方法可能丟擲檢查異常,但呼叫者沒有捕獲或宣告該異常,則編譯器會報錯。常見的檢查異常包括:
- IOException:當發生輸入輸出錯誤時丟擲,如讀寫檔案失敗。
- FileNotFoundException:當試圖開啟的檔案不存在時丟擲,是
IOException
的子類。 - SQLException:當訪問資料庫時發生SQL錯誤或資料訪問錯誤時丟擲。
- ClassNotFoundException:當應用程式試圖動態載入類(如在執行時使用
Class.forName()
方法)但找不到指定的類時丟擲。 - InterruptedException:當執行緒在等待、睡眠或嘗試加入另一個執行緒時被中斷時丟擲。
- ParseException:當嘗試將字串解析為日期或數字時格式不正確時丟擲,如
SimpleDateFormat
的parse()
方法可能丟擲此異常。
需要注意:當程式丟擲檢查異常時,Spring的事務管理 @Transactional 預設是不會生效的,需要著重注意,預設情況下只會捕獲:RuntimeException 和 Error 型別的異常,檢查異常需要捕獲處理時,就需要設定 rollbackFor 引數為:Exception 或者 Throwable 擴大事務的捕獲範圍!