Kotlin-异常

来源:互联网 发布:vscode 新建工程 编辑:程序博客网 时间:2024/06/05 14:54

异常类

在Kotlin中的所有异常类都是Throwable的子类,每个异常都有信息,堆栈信息和可选的异常原因

如果要主动抛出一个异常对象,可以使用throw表达式

throw MyException("This is error")

要捕获异常,可以用try表达式:

try {    // some code}catch (e: SomeException) {    // 异常处理}finally {    // 可选 finally block}

这里可没有或多个catch语句块,finally块也可以省略,不管怎样,都至少要有一个catch或finally.

Try是表达式

try也是表达式,它可能有返回:

val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }

try表达式的返回值有可能是try块中最后一个或者catch块中的其中一个。finally块不会影响表达式的结果.

检查异常

Kotlin中并没有检查,这其中有很多原因,但是我们还是可以提供一个简单示例。

下面的这个例子是来自JDK中的StringBuilder类:

Appendable append(CharSequence csq) throws IOException;

这个签名究竟说明什么?它说在任何时间都可以把字符串附加到一些变量上,我还必须要捕获这个异常,为什么?因为它有可能要执行IO操作,所以它的整体代码可能是这样:

//Javatry {    log.append(message)}catch (IOException e) {    // Must be safe}

并且这个还不是最好的,具体请查看【Effective Java】65章,不要忽视异常

Nothing类型

在Kotlin是一个表达式,所以你可以使用它,例如它可以是艾维斯表达式的一部分:

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'在这里才初始化