java異常體系中,所有異常都繼承至java.lang.Throwable。從異常的嚴(yán)重性,可恢復(fù)程度上,被分為了以下兩類:
- java.lang.Error
Error及其子類代表的異常通常指的是毀滅性的、不可恢復(fù)的異常,如常見的虛擬機(jī)異常類:OutOfMemory、StackOverflow,線程死了、IOError等。 - java.lang.Exception
Exception及其子類代表的異常表示的是可恢復(fù)的異常,即可以經(jīng)過程序處理后使其繼續(xù)正常工作。Exception有個(gè)比較特殊的子類:java.lang.RuntimeException,這個(gè)異常及其子類代表的是運(yùn)行時(shí)異常,官方解釋是虛擬機(jī)運(yùn)行時(shí)候進(jìn)行一些常規(guī)操作可能會(huì)拋出的異常。

Throwable類中,cause中包含了具體的異常類。比如我們針對(duì)代碼中的NullPointException封裝成了自己的ServiceException,則會(huì)把原始異常放入值cause中。
statckTrace:方法的調(diào)用鏈,包含每次調(diào)用的具體類和代碼所在行數(shù),其獲取方式是getStackTrace方法,這是個(gè)本地方法,依賴于具體的平臺(tái)。
detailMessage:對(duì)這次異常的一個(gè)描述信息,外部通過getMessage方法獲取此屬性。
SUPPRESSED_SENTINEL:jdk1.7之后新增加的屬性,當(dāng)一個(gè)方法里面產(chǎn)生了多個(gè)異常的時(shí)候,以前最新產(chǎn)生的一個(gè)異常會(huì)把之前的異常覆蓋掉。增加了這個(gè)屬性后,可以調(diào)用最終要拋出的異常對(duì)象的addSuppressed方法,把之前的異常添加進(jìn)來(lái)。
從是否需要強(qiáng)制要求調(diào)用者處理該異常層面上,異常被分為了以下兩類:
- CheckException
方法簽名中必須顯式throws該異常,調(diào)用者必須try catch處理該異常 - UnCheckedException
方法簽名中無(wú)須顯式throws該異常,調(diào)用者無(wú)須try catch處理該異常

這里需要特別注意的是,如果在代理對(duì)象的執(zhí)行方法中拋出了一個(gè)CheckedException(也可能是某個(gè)切面執(zhí)行程序拋出的異常),而方法簽名中未顯式throws該異常,則異常會(huì)被變成java.lang.reflect.UndeclaredThrowableException異常,原始異??赡軙?huì)看不到了。雖然java規(guī)范中要求checkedException必須顯式在方法簽名中拋出,編譯時(shí)候也會(huì)針對(duì)該項(xiàng)進(jìn)行檢查,但是代理對(duì)象這塊的語(yǔ)法檢測(cè)機(jī)制無(wú)法檢測(cè)到。