KOTLIN BASICS · LESSON 07

空安全与毕业

让可能缺失的数据更安全。使用 ?、?.、?: 和 !! 处理可空值,并尝试读懂一段 Android 代码。

预计 8 分钟可在 Playground 练习

先用人话理解

现实数据不总是存在:商品可能暂时缺货,用户资料也可能没有昵称。Kotlin 用可空类型明确表达这种可能性,例如 `String?`。安全调用 `?.` 和 Elvis 运算符 `?:` 能减少意外的空值错误。

记住这一点
`String` 不接受 `null`,`String?` 可以。`?.` 仅在接收者不为空时继续调用;`?:` 在左侧为空时使用右侧默认值。`!!` 会把可空值强制转成非空使用,应尽量避免,除非你能证明它绝不为空。

看一段代码

先看整体,再留意每一行的中文注释。可以复制到 Kotlin Playground 亲自运行。

Kotlin · 1.9+
fun main() {
    val productName: String? = null // ? 表示变量可以保存 null
    println(productName?.length)    // 安全调用;为空时结果也是 null
    val displayName = productName ?: "暂时缺货" // 为空时使用默认值
    println(displayName)

    // !! 强制认为值不为空;若实际为 null,会抛出异常
    val maybeCode: String? = "KOTLIN"
    println(maybeCode!!.length)
}

轮到你动手

抄下来,改一改

把商品名改为 `"键盘"`,观察输出;再把 `?:` 右边的默认文字改成你自己的提示。

小提示:先让原代码成功运行,再一次只改一个地方。

三道小测

先自己选答案,再展开核对。答案不会自动揭晓。

1. 什么类型可以表示字符串或 null?

2. `name?.length` 在 name 为 null 时会怎样?

3. 为什么要谨慎使用 `!!`?

深入阅读

官方空安全文档讲解可空类型、安全调用、Elvis 运算符和非空断言。

https://kotlinlang.org/docs/null-safety.html ↗