题目
Kotlin空安全机制及安全调用操作符的使用
信息
- 类型:问答
- 难度:⭐
考点
空安全机制,安全调用操作符,Elvis操作符
快速回答
Kotlin通过以下机制避免空指针异常:
- 默认变量不可为null,需显式声明为可空类型(加
?) - 使用安全调用操作符
?.访问可空对象属性/方法 - 配合Elvis操作符
?:提供默认值 - 使用非空断言
!!(需谨慎)强制解包
原理说明
Kotlin通过类型系统在编译期防止空指针异常:
- 所有变量默认不可为
null(非空类型) - 显式添加
?声明可空类型(如String?) - 编译器强制检查可空类型的使用,避免直接操作
代码示例
// 安全调用操作符 ?.
val length: Int? = nullableString?.length
// Elvis操作符 ?: 提供默认值
val safeLength: Int = nullableString?.length ?: 0
// 非空断言 !! (慎用)
val forcedLength: Int = nullableString!!.length // 可能抛出NPE最佳实践
- 优先使用安全调用操作符
?.链式调用:user?.address?.city - 用Elvis操作符替代
if-else处理默认值 - 避免过度使用
!!,仅在确保非空时使用 - 结合
let函数处理可空对象:nullableString?.let { println(it.length) }
常见错误
- 对可空类型直接调用方法:
val length = nullableString.length // 编译错误 - 误用Java互操作的可空性:
Java代码返回@Nullable时需在Kotlin中声明为可空类型 - 在
!!非空断言后修改对象状态导致NPE
扩展知识
- 平台类型:Java互操作时类型显示为
String!,需开发者自行判断可空性 - 安全转换:
as?操作符避免转换异常(obj as? String)?.length - 集合过滤:
filterNotNull()快速过滤空元素list.filterNotNull().forEach { println(it.length) }