侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Kotlin空安全机制及安全调用操作符的使用

2025-12-11 / 0 评论 / 4 阅读

题目

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) }