知用网
白蓝主题五 · 清爽阅读
首页  > 电脑技巧

Kotlin空安全机制:让程序少点崩溃多点安心

写代码最怕什么?空指针异常肯定排前三。一不小心调了个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。省下的不只是调试时间,更是用户的耐心。