Kotlin 通过 空安全(Null Safety) 机制减少了空指针异常(NullPointerException,NPE)。以下是 Kotlin 中处理空指针的常见方式:
1. 可空类型 (?
)
Kotlin 默认所有变量都不能为空。如果需要允许 null
,必须显式声明:
1 | var name: String? = "Kotlin" |
2. 安全调用 (?.
)
当变量可能为 null
时,可以使用 安全调用 来避免 NPE:
1 |
|
3. Elvis 运算符 (?:
)
提供默认值,避免 null
影响程序逻辑:
1 |
|
4. 非空断言 (!!
)
强制告诉编译器变量不为空,否则抛出 NullPointerException
:
1 |
|
⚠ 慎用 !!
,仅在明确不为空时使用!
5. let
作用域函数
let
结合安全调用 (?.
),可用于在非空时执行某些操作:
1 | name?.let { |
6. lateinit
和 by lazy
lateinit
适用于非null
类型的延迟初始化:1
2lateinit var text: String
// text.length // 若未初始化,访问会抛出 UninitializedPropertyAccessExceptionlazy
适用于val
类型的惰性初始化:1
2
val message: String by lazy { "Hello, Kotlin!" }
7. requireNotNull
和 checkNotNull
手动检查 null
并抛出异常:
1 |
|
8. 数据类默认值
如果某个字段可能为空,最好提供默认值:
1 |
|
9. 平台类型 (Java
互操作)
从 Java 代码获取的变量可能为空,Kotlin 不能自动推断:
1 |
|
10. 使用 @Nullable
和 @NotNull
注解
在 Kotlin 互操作 Java 时,可以使用这些注解来增强类型安全:
1 | @Nullable |
总结
方式 | 作用 |
---|---|
? |
允许 null |
?. |
安全调用 |
?: |
默认值 |
!! |
非空断言(可能抛 NPE) |
let |
仅在非空时执行 |
lateinit / lazy |
延迟初始化 |
requireNotNull |
手动 null 检查 |
@Nullable |
Java 互操作 |