写代码最怕什么?空指针异常肯定排前三。一不小心调了个null对象的方法,App直接闪退,用户一脸懵。Kotlin的空安全机制就是来解决这个老大难问题的,它从语言层面帮你挡住大部分空指针坑。
可空类型与非空类型的区分
Kotlin里,默认声明的变量是不能为null的。比如这样写:
var name: String = "Alice"
name = null // 编译报错!
想让一个变量能接受null值,必须显式加上?符号:
var name: String? = "Alice"
name = null // 合法
这样一来,编译器就知道这个变量可能为空,后续使用时就得小心处理。
安全调用操作符 ?.
当你有一个可能为null的变量,又想调它的方法或属性,用?.就对了。
val length = name?.length
这段代码的意思是:如果name不为null,就取length;如果是null,整个表达式结果就是null,不会崩溃。特别适合链式调用:
val city = user?.address?.city
哪怕中间任何一个环节是null,也不会抛异常,最终得到null而已。
Elvis操作符 ?:
有时候你希望在值为null时给个默认值,这时候用?:很顺手。
val len = name?.length ?: 0
意思是:如果name不为空,取其长度;否则返回0。比写三元判断简洁多了。
强制调用 !!
有些时候你非常确定某个可空变量此刻不是null,可以用!!告诉编译器“我负责”。
val len = name!!.length
但要小心,万一真碰上null,运行时还是会抛出NullPointerException。这招就像开车不系安全带,省事但有风险。
let函数配合安全调用
在做非空处理时,let经常和?.一起用,避免嵌套if判断。
name?.let {
println("The name is $it")
}
只有name不为null时,里面的代码块才会执行。代码看起来干净利落,逻辑也清晰。
实际开发中,比如从网络接口拿用户数据,很多字段可能是空的。用Kotlin这套空安全机制,能在编译期发现潜在问题,而不是等到用户手机上才暴露bug。省下的不只是调试时间,更是用户的耐心。