所有的异常类都继承自Throwable
类
抛出异常使用throw
表达式
throw Exception("wrong")
捕获一个异常使用 try...catch
表达式
try {
// 编码
} catch (e: SomeException) {
// 异常时处理方法
} finally {
// 不论异常还是正常结束都要执行当前内容
}
可以有零个或多个
catch
块,finally
可以省略。然而,至少需要一个catch
或finally
try是一个表达式
意味着try
可以有返回值
val a: Int? = try { input.toInt() } catch (e: NumberFormatException) { null }
返回值要么是
try
中的最后一个表达式,要么是catch
中的最后一个表达式。finally
中的内容不影响表达式的结果
异常检查
编译期异常是检查异常
Appendable append(CharSequence csq) throws IOException;
kotlin
没有检查异常,原因是多方面的,主要是因为写代码时显得臃肿,降低写代码效率
如果想使用解码异常给java
或者其他代码使用,可以使用@Throws()
注解
Nothing 类型(The Nothing type)
throw
是一个表达式,所以你可以将它作为Elvis
表达式的一部分来使用:
val s = person.name ?: throw IllegalArgumentException("Name required")
throw
表达式的返回值类型是Nothing
。这种类型没有值,用于标记永远无法到达的代码位置。在你自己的代码中,你可以使用Nothing
来标记一个永远不返回的函数:
fun main() {
val a : Any? = null
val s = a ?: fail("Name required")
println(s)
}
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
// 报错 - Exception in thread "main" java.lang.IllegalArgumentException: Name required
在类型推断时,初始化值为null
,则会被推断为Nothing?
类型
val x = null // 'x' 的类型是 `Nothing?`
val l = listOf(null) // 'l' 的类型是 `List<Nothing?>`