Kotlin 通过 空安全(Null Safety) 机制减少了空指针异常(NullPointerException,NPE)。以下是 Kotlin 中处理空指针的常见方式:


1. 可空类型 (?)

Kotlin 默认所有变量都不能为空。如果需要允许 null,必须显式声明:

1
2
var name: String? = "Kotlin"
name = null // 允许赋值 null

2. 安全调用 (?.)

当变量可能为 null 时,可以使用 安全调用 来避免 NPE:

1
2

val length: Int? = name?.length // name 为 null 时,length 也为 null

3. Elvis 运算符 (?:)

提供默认值,避免 null 影响程序逻辑:

1
2

val length: Int = name?.length ?: 0 // name 为 null 时,length 取 0

4. 非空断言 (!!)

强制告诉编译器变量不为空,否则抛出 NullPointerException

1
2

val length: Int = name!!.length // 如果 name 为空,则抛出 NPE

慎用 !!,仅在明确不为空时使用!


5. let 作用域函数

let 结合安全调用 (?.),可用于在非空时执行某些操作:

1
2
3
name?.let {
println("Length: ${it.length}") // 仅当 name 不为空时执行
}

6. lateinitby lazy

  • lateinit 适用于非 null 类型的延迟初始化:

    1
    2
    lateinit var text: String
    // text.length // 若未初始化,访问会抛出 UninitializedPropertyAccessException
  • lazy 适用于 val 类型的惰性初始化:

    1
    2

    val message: String by lazy { "Hello, Kotlin!" }

7. requireNotNullcheckNotNull

手动检查 null 并抛出异常:

1
2

val nonNullName: String = requireNotNull(name) { "name 不能为空" }

8. 数据类默认值

如果某个字段可能为空,最好提供默认值:

1
2

data class User(val name: String = "Unknown")

9. 平台类型 (Java 互操作)

从 Java 代码获取的变量可能为空,Kotlin 不能自动推断:

1
2

val text: String? = javaMethodReturningNullable() // Java 方法返回值可能为 null

10. 使用 @Nullable@NotNull 注解

在 Kotlin 互操作 Java 时,可以使用这些注解来增强类型安全:

1
2
@Nullable
public String getNullableString() { return null; }

总结

方式 作用
? 允许 null
?. 安全调用
?: 默认值
!! 非空断言(可能抛 NPE)
let 仅在非空时执行
lateinit / lazy 延迟初始化
requireNotNull 手动 null 检查
@Nullable Java 互操作