异常
Kotlin官网:Other-Exceptions
异常类
Kotlin中异常都是Throwable
的子类。
异常包含消息、堆栈追踪、原因(可选)。
使用throw
表达式抛出异常:
throw MyException("Hi There!")
使用try
表达式捕获异常:
try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}
try表达式中,catch可以有0,1或多个,finally也可以省略,但是catch和finally至少要有一个。
Try表达式
Kotlin中try
为表达式,有返回值:
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
try
表达式的返回值为try块的最后一行或者catch的块的最后一行,finally不会影响表达式的值。
检查异常
Kotlin中没有检查异常,这么做的原因有很多,举个例子,JDK中StringBuilder类实现的接口:
Appendable append(CharSequence csq) throws IOException;
这个方法签名说明每次调用都可能抛出IOException,所以在调用的地方要处理:
try {
log.append(message)
}
catch (IOException e) {
// Must be safe
}
这样写并不好,Effective Java中提到:不要忽略异常
Nothing类
Kotlin中throw
语句是表达式,有返回值,例如可以用在Elvis表达式中:
val s = person.name ?: throw IllegalArgumentException("Name required")
throw
表达式的返回值是Nothing类,没有任何实际的值,可以用作语句未执行的标识:
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
在调用这个函数时,编译器就知道会中断后面的内容:
val s = person.name ?: fail("Name required")
println(s) // 's' is known to be initialized at this point
另一个Nothing类的用处是类型推导,可空类型Nothing?
只有一个可能的值null。当使用null初始化一个没有指明类型的变量时,编译器会将变量类型推导为Nothing?类:
val x = null // 'x' has type `Nothing?`
val l = listOf(null) // 'l' has type `List<Nothing?>
Java交互
详见Kotlin官方文档Calling Java from Kotlin