这是 Kotlin 最强大的特性之一。在 Kotlin 中,类型系统严格区分了”可空”和”不可空”

1. 默认不可空

var name: String = "Null猫"
name = null // ❌ 编译报错!String 类型不允许为 null

2. 可空类型 ( ? 表示)

如果你允许一个变量为 null,必须在类型后面加上 ?

var nullableName: String? = "Null猫"
nullableName = null // ✅ 允许

3. 如何安全地调用可空变量?

当你有一个 String? 变量时,不能直接调用它的方法(比如 .length),编译器会拦截:

val length = nullableName.length // ❌ 编译报错

安全调用符 ?.

如果变量不为 null 则调用,否则返回 null

val length = nullableName?.length // ✅ 返回 Int? 类型

Elvis 运算符 ?:(空合并)

如果左边为 null,则返回右边的值:

val length = nullableName?.length ?: 0
// 解释:如果 nullableName 为 null,length 的值就是 0

安全转换 as?

如果转换失败,不会抛出异常,而是返回 null

val number: Int? = "123" as? Int // 转换失败时,number 为 null

非空断言 !!

如果你非常确定这个变量此时绝对不是 null,可以使用 !! 强行调用。但如果判断失误,就会抛出空指针异常:

val length = nullableName!!.length // ⚠️ 除非万不得已,否则不推荐