Kotlin 的**空安全(Null Safety)**是它在语言层面解决 Java 中常见 NullPointerException(NPE)问题的核心设计。核心思想是:在编译期就区分“可空”和“不可空”类型,从而避免运行时的空指针错误。
下面从几个关键方面说明 Kotlin 是怎么做的。
Kotlin 把类型分为两类:
var name: String = "Tom"
name = null // ❌ 编译错误
var name: String? = "Tom"
name = null // ✅ 允许
?表示“这个变量可能为 null”。
val len = name.length // ❌ 编译错误(name 可能为 null)
必须“先处理 null”,否则无法编译。
?.如果为 null,直接返回 null,不抛异常:
val len: Int? = name?.length
?:提供默认值:
val len = name?.length ?: 0
等价于:
if (name != null) name.length else 0
!!强制认为不为 null(不推荐滥用):
val len = name!!.length // 如果是 null,会抛 NPE
as?转换失败返回 null:
val num = obj as? Int
在 null 检查后,自动变为非空类型:
if (name != null) {
println(name.length) // ✅ 自动转为 String
}
fun foo(s: String) {} // 不接受 null
fun bar(s: String?) {} // 可以接受 null
从 Java 调用 Kotlin 时,类型可能是“平台类型”:
val s: String! = javaMethod() // 可能是 null,编译器不保证
String! 是“平台类型”✅ 在编译阶段就拦截大部分 NPE
✅ 明确表达“这个值是否可能为 null”
✅ 强制开发者处理空情况
✅ 比 Java 的 @Nullable / @NonNull 更严格
Kotlin 的空安全 = 类型系统区分可空/不可空 + 编译期强制处理 null + 一系列安全运算符
如果你愿意,我也可以对比 Kotlin vs Java 的空安全,或者讲 实际项目中的最佳实践。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。