異常類(lèi)(Exception Classes)
Kotlin中所有的異常類(lèi)都是Throwable的子類(lèi)。每個(gè)異常都有消息、堆?;厮菪畔⒑涂蛇x的原因。
要拋出一個(gè)異常對(duì)象,使用throw表達(dá)式:
throw MyException("Hi There!")
為了捕獲一個(gè)異常,使用try表達(dá)式:
try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}
可以有0到多個(gè)catch塊,finally塊可以省略。但是catch塊和finally塊至少應(yīng)該存在一個(gè)。
try是一個(gè)表達(dá)式(Try is an expression)
try是一個(gè)表達(dá)式,也就是說(shuō),它可以有一個(gè)返回值:
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
try表達(dá)式的返回值要么是try塊的最后一個(gè)表達(dá)式,也哦么是catch塊的最后一個(gè)表達(dá)式。finally塊對(duì)try表達(dá)式的結(jié)果沒(méi)有影響。
檢查異常(Checked Exceptions)
Kotlin沒(méi)有檢查異常(編譯時(shí)異常)。原因有很多,我們僅提供一個(gè)簡(jiǎn)單的例子。例子省略...
Nothing類(lèi)型(The Nothing type)
在Kotlin中,throw是一個(gè)表達(dá)式,因此可以將其作為Elvis表達(dá)式的一部分:
val s = person.name ?: throw IllegalArgumentException("Name required")
throw表達(dá)式的類(lèi)型是Nothing。該類(lèi)型沒(méi)有值,僅用于標(biāo)記該代碼位置永遠(yuǎn)不可能到達(dá)。在你的代碼中,你可以使用Nothing來(lái)標(biāo)記一個(gè)永遠(yuǎn)不會(huì)返回的函數(shù):
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
當(dāng)你調(diào)用該函數(shù)的時(shí)候,編譯器將知道執(zhí)行不會(huì)超出調(diào)用:
val s = person.name ?: fail("Name required")
println(s) // 's' is known to be initialized at this point
Java互操作性
參見(jiàn)Java互操作性章節(jié)...