CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Kotlin 语言入门/课时/空安全
RawBlame
课时目录12 节

Kotlin 语言入门

  1. 01Kotlin 是什么
  2. 02基础语法与类型
  3. 03控制流
  4. 04函数与 Lambda
  5. 05集合 API
  6. 06类与 OOP
  7. 07空安全
  8. 08协程
  9. 09JVM 与 Spring
  10. 10Android 与 Compose
  11. 11Ktor 服务端
  12. 12综合练习

空安全

Nullable、?.、!!、Elvis。

30 分钟

空安全

空安全是 Kotlin 的标志性特性:类型系统区分可空与不可空,?.、?:、!! 与 let 让 NPE 在编译期尽可能暴露。

学习目标

  • 理解 String 与 String? 的区别
  • 掌握安全调用 ?.、Elvis ?:、非空断言 !!
  • 会用 let、also 处理可空链式逻辑

Nullable 类型

fun printLength(s: String) {
    println(s.length)   // s 不可空,无需判空
}

fun printLengthOrNull(s: String?) {
    if (s != null) {
        println(s.length)   // 智能转换为 String
    } else {
        println("null")
    }
}

fun main() {
    printLength("hello")
    printLengthOrNull(null)
    printLengthOrNull("kotlin")
}

String? 表示可能为 null;String 编译器保证非空,赋值 null 会报错。

安全调用与 Elvis

data class Lesson(val slug: String, val title: String?, val order: Int)

fun getTitle(lesson: Lesson?): String {
    return lesson?.title ?: "未命名"
}

fun main() {
    val l1 = Lesson("kt-intro", "Kotlin 是什么", 1)
    val l2 = Lesson("kt-draft", null, 2)

    println(getTitle(l1))    // Kotlin 是什么
    println(getTitle(l2))    // 未命名
    println(getTitle(null))  // 未命名

    // 链式安全调用
    val len = l2.title?.length ?: 0
    println("标题长度: $len")
}

?. 左侧为 null 则整个表达式为 null;?: 左侧为 null 时取右侧默认值。

let 与非空断言

fun processSlug(slug: String?) {
    slug?.let { s ->
        println("处理: ${s.uppercase()}")
    } ?: println("slug 为空,跳过")
}

fun riskyParse(input: String?): Int {
    // !! 非空断言:确定非空时用,否则 NPE
    return input!!.toInt()
}

fun main() {
    processSlug("kt-intro")
    processSlug(null)

    // 安全转换
    val any: Any = "42"
    val num = any as? Int   // 失败返回 null,不抛异常
    println(num)            // null
}

let 仅在非空时执行块;!! 慎用,优先 ?. 与 ?:。

与 Java 对照

KotlinJava
String?@Nullable String
s?.lengths != null ? s.length() : null
s ?: "default"
Optional.ofNullable(s).orElse("default")
s!!直接调用,可能 NPE
as? Intinstanceof + 安全 cast

Java 的 @Nullable / @NonNull 注解在 Kotlin 互操作时会映射为平台类型,仍需注意。

练习

  • 写函数 formatTitle(title: String?): String,null 或 blank 返回「未命名」
  • 用 ?.let 链式处理 Track? → Lesson? → title
  • 对比 Java Optional 与 Kotlin Elvis 的用法

小结

Nullable 类型 + ?. + ?: 让空指针在编译期可控。 下一课协程。见 kotlin-essentials。

加载本节练习…
← 上一课类与 OOP下一课 →协程