空值安全
理解 Kotlin 的空值安全系统:可空类型、安全调用运算符、Elvis 运算符,以及如何消除 NullPointerExceptions。
空值安全 是 CoddyKit 上的免费 Android Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
价值十亿美元的错误
在 Java 中,任何变量都可以是 null,从而在运行时引发 NullPointerException (NPE),这是 Android 应用中最常见的崩溃原因之一。
发明 null 的 Tony Hoare 称这是他价值十亿美元的错误。
Kotlin 通过空值安全系统在编译时消除 NPE。
可空类型与非空类型
在 Kotlin 中,类型默认不可为空。若要允许 null,请在类型后添加 ?:
String— 保证永远不为 nullString?— 可以为 null
编译器会强制执行这一规则,不允许您将 null 赋给不可空类型。
可空类型示例
编译器会在应用运行前捕获空值错误:
fun main() {
val name: String = "Alice" // never null
// name = null // COMPILE ERROR
var nickname: String? = "Al" // nullable
nickname = null // OK
println(name)
println(nickname) // null
}安全调用运算符 ?.
安全调用运算符 ?. 仅在对象不为 null 时调用方法。如果对象为 null,它会返回 null,而不是导致崩溃。
nickname?.length → 返回长度;如果 nickname 为 null,则返回 null。
安全调用的实际用法
使用 ?. 安全访问可空属性:
fun main() {
var text: String? = "Hello"
println(text?.length) // 5
println(text?.uppercase()) // HELLO
text = null
println(text?.length) // null (no crash!)
println(text?.uppercase()) // null
}Elvis 运算符 ?:
Elvis 运算符 ?: 会在表达式为 null 时提供默认值:
val len = text?.length ?: 0
可以理解为:“text 的长度;如果 text 为 null,则为 0”。
它以 Elvis 表情符号 🕺 命名,因为该表情的发型看起来像 ?:。
Elvis 运算符示例
使用 ?: 提供安全的默认值:
fun main() {
var name: String? = "Bob"
println(name?.length ?: 0) // 3
name = null
println(name?.length ?: 0) // 0
val display = name ?: "Anonymous"
println(display) // Anonymous
}使用 if 检查空值
在 if (x != null) 代码块中,Kotlin 会自动将可空类型智能转换为非空类型,因此不需要在代码块中使用 ?.。
智能转换示例
Kotlin 会在空值检查后缩小类型范围:
fun printLength(text: String?) {
if (text != null) {
// 'text' is now String (non-nullable) here
println("Length: ${text.length}") // no ?. needed
} else {
println("text is null")
}
}
fun main() {
printLength("Kotlin") // Length: 6
printLength(null) // text is null
}快速检查
null?.length ?: -1 的计算结果是什么?
回顾:空值安全
Kotlin 的空值安全系统可以消除 NPE:
- 类型默认不可为空;添加
?以允许 null ?.安全调用——返回 null,而不是导致崩溃?:Elvis 运算符——在值为 null 时提供默认值- 在
if (x != null)代码块中进行智能转换
下一步:使用类和对象组织代码。
常见问题解答
「空值安全」课时是免费的吗?
是的 — 「空值安全」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「空值安全」这节课中我会学到什么?
理解 Kotlin 的空值安全系统:可空类型、安全调用运算符、Elvis 运算符,以及如何消除 NullPointerExceptions。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「空值安全」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。