DELOG 10.10 理解異常 & 為什么要設(shè)計(jì)CE和RE?& Kotlin中是怎么處理的?
異常的分類(lèi):

Java中的異??梢詮膬蓚€(gè)方面進(jìn)行分類(lèi):
1. 繼承關(guān)系上:通常將RuntimeException的子類(lèi)和Error類(lèi)的子類(lèi)稱(chēng)作unchecked exception。其他的稱(chēng)作checked exception。
2. 運(yùn)行結(jié)果上:Java的異常分為checked exception和 unchecked exception。checked exception (CE)是程序預(yù)期的一部分,而unchecked exception(runtime exception,RE)卻不是。
設(shè)計(jì)CE和RE的目的
CE:表示當(dāng)前的函數(shù)/方法返回的結(jié)果可能存在兩種,一種是正常返回的結(jié)果,一種是異常。之所以需要這樣設(shè)計(jì),是一種自然而然的合約。程序的設(shè)計(jì)者在方法簽名中拋出異常(可能會(huì)發(fā)生的異常),使用這就應(yīng)該做出處理。
借助知乎的這篇回答的解釋?zhuān)篔ava設(shè)計(jì)出checked exception有必要嗎? - BachScript的回答 - 知乎 https://www.zhihu.com/question/30428214/answer/852807268

RE:反映的是一種意料之外的狀況。但是RE也是必須的,如果不使用RE,在調(diào)用鏈上,調(diào)用鏈的上游拋出了異常,下游就需要知道如何處理,并且上下游的模塊也會(huì)因?yàn)檫@個(gè)異常被耦合到一起。
Kotlin中是如何處理的呢?
Kotlin中都是unchecked 異常,因?yàn)榭偸菣z查異常會(huì)降低生產(chǎn)力,但是卻沒(méi)有明顯提高代碼質(zhì)量。
而且Kotlin通過(guò)類(lèi)型機(jī)制實(shí)現(xiàn)了更好的【類(lèi)型匹配】:
如果按照上面的文章中的union type來(lái)理解,這里的a的類(lèi)型應(yīng)該是Int|NumberFormatException,但是Kotlin中支持try表達(dá)式,所以當(dāng)真正發(fā)生異常的時(shí)候可以將a的值設(shè)為空值。
總結(jié):
CE和RE都是Java異常機(jī)制的一部分。CE更像是一種代碼規(guī)范,表示返回的結(jié)果類(lèi)型要么事異常要么就是指定的返回類(lèi)型。
RE在運(yùn)行過(guò)程中發(fā)證的異常,也是必須的為了避免耦合性。
反正RE不能避免,而且CE沒(méi)有顯著提升代碼質(zhì)量,所以Kotlin也沒(méi)有支持CE。但是在真正遇到可能出現(xiàn)的異常的時(shí)候,還是可以進(jìn)行try-catch。
參考內(nèi)容:
淺談Kotlin的Checked Exception機(jī)制:
https://segmentfault.com/a/1190000025161951
官方文檔:
https://www.kotlincn.net/docs/reference/exceptions.html