Kotlin Academy · 课时

可空类型与非空类型

类型系统基础

第 1 / 4 课13 个步骤

可空类型与非空类型 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 可空类型与非空类型
  2. 安全调用与 Elvis
  3. !! 运算符
  4. 平台类型
← 返回 Kotlin Academy