可空类型与非空类型
类型系统基础
可空类型与非空类型 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
为什么空安全很重要
臭名昭著的 NullPointerException 已导致无数程序崩溃。Kotlin 通过将可空性纳入类型系统,正面解决了这个问题。
在 Kotlin 中,编译器知道一个值是否可以为空,并强制您在遇到问题之前处理这种可能性。
非空类型
默认情况下,Kotlin 中的每种类型都是非空的。String 类型的变量绝不能保存 null。
这一保证在编译时强制执行,因此您无需检查即可放心使用该值。
fun main() {
val name: String = "Alice"
println(name.length)
}拒绝为非空类型赋值空值
尝试将 null 放入非空类型时,编译器会立即阻止您。
下面这行代码无法通过编译,因为 String 不接受 null:
val name: String = null→ 错误
fun main() {
val city: String = "Paris"
// val broken: String = null // compile error
println(city)
}可空类型
要允许 null,请在类型后添加一个问号:String?。
这就是可空类型。它可以保存实际值,也可以保存 null。
fun main() {
val maybeName: String? = null
println(maybeName)
}可空类型与非空类型
这两项声明看起来几乎相同,但行为却大不相同:
val a: String→ 永远不为空val b: String?→ 可能为空
这一个 ? 会改变变量的整个类型契约。
fun main() {
val a: String = "hi"
val b: String? = "hi"
println(a)
println(b)
}编译器会保护对可空值的访问
不能直接对可空值调用方法。编译器会拒绝这样做,因为该值可能为空。
下面注释掉的代码行无法通过编译:
- 对
String?使用maybe.length→ 错误
fun main() {
val maybe: String? = "text"
// println(maybe.length) // compile error
println(maybe)
}检查空值
使用可空值的一种简单方式是进行显式的 if 检查。
在 if 代码块内,Kotlin 知道该值不为空,因此允许您安全地使用它。
fun main() {
val maybe: String? = "hello"
if (maybe != null) {
println(maybe.length)
}
}函数参数中的空值
参数类型也遵循这一规则。类型为 String 的参数必须接收实际值,而 String? 接受 null。
这样,函数签名就能清楚说明它们接受什么内容。
fun greet(name: String?) {
if (name != null) {
println("Hello, " + name)
} else {
println("Hello, guest")
}
}
fun main() {
greet("Mia")
greet(null)
}可空返回类型
函数可以返回可空类型,以表示结果可能不存在。
调用方随后必须在使用结果之前处理可能出现的 null。
fun firstChar(text: String?): Char? {
if (text == null || text.isEmpty()) return null
return text[0]
}
fun main() {
println(firstChar("Kotlin"))
println(firstChar(null))
}默认类型推断
为字面量赋值时,Kotlin 会自动推断出非空类型。
val n = "text"→ 推断为String
要使其可空,必须使用 ? 显式声明类型。
fun main() {
val n = "text" // inferred String (non-null)
val m: String? = "text" // explicit nullable
println(n.length)
println(m)
}综合运用
类型系统将值分为两个清晰的组:
- 非空:始终可以安全使用
- 可空:使用前必须进行处理
这种区分将空值错误从运行时崩溃转变为编译时错误。
fun main() {
val safe: String = "always here"
val risky: String? = null
println(safe.uppercase())
if (risky != null) println(risky.uppercase()) else println("no value")
}快速检查
检验您对可空类型和非空类型的理解。
回顾
您已学习 Kotlin 空安全的基础知识:
- 默认情况下,每种类型都是非空的
- 添加
?会创建可空类型 - 编译器会阻止对可空值进行不安全的访问
- 使用
if (x != null)检查可以让您安全地使用该值
接下来,您将学习一些简洁的运算符,让可空值的处理变得轻松。
用 AI 导师学习 Kotlin — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「可空类型与非空类型」课时是免费的吗?
是的 — 「可空类型与非空类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「可空类型与非空类型」这节课中我会学到什么?
类型系统基础 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「可空类型与非空类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 可空类型与非空类型
- 安全调用与 Elvis
- !! 运算符
- 平台类型