异常

    使用 throw-表达式来抛出异常:

    使用 try-表达式来捕获异常:

    1. try {
    2. // 一些代码
    3. }
    4. // 处理程序
    5. }
    6. finally {
    7. // 可选的 finally 块
    8. }

    可以有零到多个 catch 块。finally 块可以省略。 但是 catchfinally 块至少应该存在一个。

    try 是一个表达式,即它可以有一个返回值:

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

    try-表达式的返回值是 try 块中的最后一个表达式或者是(所有)catch 块中的最后一个表达式。 finally 块中的内容不会影响表达式的结果。

    以下是 JDK 中 StringBuilder 类实现的一个示例接口:

    这个签名是什么意思? 它是说,每次我追加一个字符串到一些东西(一个 、某种日志、一个控制台等)上时我就必须捕获那些 IOException。 为什么?因为它可能正在执行 IO 操作(Writer 也实现了 Appendable)…… 所以它导致这种代码随处可见的出现:

    1. try {
    2. log.append(message)
    3. catch (IOException e) {
    4. // 必须要安全
    5. }

    这并不好,参见 第 77 条:不要忽略异常

    Bruce Eckel says about checked exceptions:

    If you want to alert callers of possible exceptions when calling Kotlin code from Java, Swift, or Objective-C, you can use the @Throws annotation. Read more about using this annotation for Java as well as .

    在 Kotlin 中 throw 是表达式,所以你可以使用它(比如)作为 Elvis 表达式的一部分:

    throw 表达式的类型是特殊类型 Nothing。 该类型没有值,而是用于标记永远不能达到的代码位置。 在你自己的代码中,你可以使用 Nothing 来标记一个永远不会返回的函数:

    当你调用该函数时,编译器会知道在该调用后就不再继续执行了:

    1. val s = person.name ?: fail("Name required")
    2. println(s) // 在此已知“s”已初始化

    可能会遇到这个类型的另一种情况是类型推断。这个类型的可空变体 Nothing? 有一个可能的值是 null。如果用 null 来初始化一个要推断类型的值,而又没有其他信息可用于确定更具体的类型时,编译器会推断出 Nothing? 类型:

    1. val l = listOf(null) // “l”具有类型 `List<Nothing?>