先用人话理解
现实数据不总是存在:商品可能暂时缺货,用户资料也可能没有昵称。Kotlin 用可空类型明确表达这种可能性,例如 `String?`。安全调用 `?.` 和 Elvis 运算符 `?:` 能减少意外的空值错误。
记住这一点
`String` 不接受 `null`,`String?` 可以。`?.` 仅在接收者不为空时继续调用;`?:` 在左侧为空时使用右侧默认值。`!!` 会把可空值强制转成非空使用,应尽量避免,除非你能证明它绝不为空。
`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. 为什么要谨慎使用 `!!`?
1. B. String? 是可空字符串类型。
2. A. 安全调用返回 null。
3. A. `!!` 可能导致运行时异常。
深入阅读
官方空安全文档讲解可空类型、安全调用、Elvis 运算符和非空断言。
https://kotlinlang.org/docs/null-safety.html ↗