在 Kotlin 里,空指针异常(NullPointerException,简称 NPE) 的设计目标和 Java 不同:
Kotlin 在编译期就通过「可空类型系统」尽量避免 NPE,而不是等到运行时才抛异常。
下面从 原理 → 常见处理方式 → 最佳实践 讲清楚。
var name: String = "Tom"
// name = null // ❌ 编译错误
?var name: String? = null // ✅
?.如果为 null,整个表达式返回 null,不会抛异常
val len: Int? = name?.length
?:为 null 时提供默认值
val len = name?.length ?: 0
等价于:
val len = if (name != null) name.length else 0
!!(⚠️ 谨慎使用)强制认为不为 null,为 null 会抛 NPE
val len = name!!.length
✅ 只在非常确定不为 null 时使用
as?转换失败返回 null
val num = obj as? Int
let + 安全调用(常用)只在非 null 时执行逻辑
name?.let {
println(it.length)
}
is 智能类型转换if (name != null) {
println(name.length) // 自动转为非空
}
虽然 Kotlin 很安全,但以下情况仍可能 NPE:
!!val x: String? = null
println(x!!) // NPE
Kotlin 不知道 Java 是否返回 null
// Java
public String getName() { return null; }
// Kotlin
val name = javaObj.name // 可能为 null
✅ 建议:
val name = javaObj.name ?: ""
lateinit 未初始化lateinit var user: User
user.name // IllegalStateException
✅ 检查:
if (::user.isInitialized) {
user.name
}
Java 互操作时类型显示为 String!
编译器不保证安全
✅ 优先使用:
?.?:letis 判断❌ 尽量避免:
!!lateinit✅ Java 互操作时:
Kotlin 不是“处理”空指针异常,而是“从语言层面尽量不让它发生”。
如果你愿意,我也可以:
你想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。