Kotlin 异常

1. 概述

和 Java 一样,Kotlin 的异常都继承于 Throwable 类。

每个异常都拥有 message stacktracecause

2. 抛出异常

使用 throw 抛出一个异常

1
throw MyException("Hi There!")

注意到,没有 new

3. 捕获异常

使用 try-catch-finally 来进行异常捕获和处理。

1
2
3
4
5
6
7
8
9
try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}

可以有多个 catch 块,finally 块是可选的;
但是必须存在至少一个 catch 块,否则就必须有 finally

4. try 表达式

try 也可以是一个表达式,也就是说它可以拥有返回值

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

表达式的返回值不是 try 块的最后一个值,就是 catch 块的最后一个值。
finally 块中的语句不会被作为返回值返回。

5. 已检查异常

不像 Java,Kotlin 中没有已检查异常
也就说它不需要也不会在函数头进行 throws 声明。

原因在于,如果类似 Java 拥有已检查异常,那么:

1
Appendable append(CharSequence csq) throws IOException;

当我在调用这个方法时,我就必须进行异常捕获(有很多方法内部不允许再次抛出异常)。

1
2
3
4
5
6
try {
log.append(message)
}
catch (IOException e) {
// Must be safe
}

很多时候,就会写出上面的代码,由于生吞了异常,这是一种非常不好的写法,同时这也违反了《Effective Java》中的条款。

《Effective Java》第六十五条:不要忽略异常

同样也有很多关于已检查异常的批评意见
see here

  • 本文作者: Wafer Li
  • 本文链接: https://wafer.li/Kotlin/Kotlin 异常/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0%