首先,需要了解異常體系的結(jié)構(gòu):

異常體系.png
看上面的結(jié)構(gòu),Throwable是所有異常的基類,有兩個(gè)子類:Error和Exception;
- Error:表示系統(tǒng)錯(cuò)誤或者資源耗盡,Java系統(tǒng)自己使用,應(yīng)用程序不該拋出和處理(但是是可以try catch的);
- Exception:表示應(yīng)用程序錯(cuò)誤;
這里需要注意,圖中標(biāo)出的兩種異常類型:
- 受檢異常(checked exception):Java強(qiáng)制要求必須在throws語句中拋出,調(diào)用者必須處理,否則無法編譯通過;
- 未受檢查異常(unchecked exception):未做要求
try-catch-finally需要注意的地方
- 異常被捕獲之后,try語句內(nèi)異常點(diǎn)之后的代碼就不會(huì)再執(zhí)行了,執(zhí)行完了catch內(nèi)的語句后,繼續(xù)執(zhí)行catch外的語句;
- catch方法從上至下開始匹配,找到第一個(gè)catch塊后,后面的catch就不再會(huì)執(zhí)行了,因此,catch的順序需要從上至下為子類到父類;
- 同一個(gè)catch可以捕獲多個(gè)異常,中間用"|"分隔;
- catch之后,可以重新拋出異常;常用于增加一些錯(cuò)誤信息等
- finally執(zhí)行的順序要注意:如果異常發(fā)生但是沒有被捕獲,則finally會(huì)在異常被拋給上層之前執(zhí)行;
- catch并不是必須的,可以只有try-finally;
關(guān)于finally和return語句: - try或者catch內(nèi)如果有return,則return會(huì)在finally執(zhí)行之后才會(huì)執(zhí)行,但是finally無法改變r(jià)eturn的值;(這里會(huì)將返回值暫時(shí)保存在一個(gè)臨時(shí)變量中,
最后再返回臨時(shí)變量的值) - finally中有return呢?try和catch內(nèi)的return將會(huì)丟失,實(shí)際會(huì)返回finally中的return值;注意:此時(shí),不僅會(huì)覆蓋try和catch的返回值, 并且會(huì)掩蓋try和catch內(nèi)的異常,就像異常沒有發(fā)生一樣,此時(shí)異常不會(huì)再向上傳遞了;
- finally中如果拋出異常,原異常也會(huì)被覆蓋;
- 應(yīng)該盡量避免在finally中使用return或者拋出異常;
總之,不管有無return,finally都是會(huì)保證一定會(huì)執(zhí)行的
throws關(guān)鍵字
- 用于聲明一個(gè)方法可能拋出的異常
- 其調(diào)用者要不catch這個(gè)異常,或者就繼續(xù)使用throws拋出
總結(jié)
- 當(dāng)真正出現(xiàn)異常的時(shí)候,應(yīng)該拋出異常,而不是返回特殊值;
- 如果知道自己如何處理異常,就進(jìn)行處理;否則,就上拋;
- 上拋時(shí),如果自己有額外信息,就應(yīng)該提供這些信息,可以以原異常為cause重新拋出;