kotlin学习——空安全

NullPointerException(NPE) 堪称最令人头痛的运行时异常之一。无论是Java开发者还是其他语言的使用者,总会在代码调试时被突如其来的空指针异常折磨得焦头烂额。而Kotlin的空安全设计帮助开发人员从根本上解决问题。

Kotlin的空安全

1.空安全类型

在kotlin中,有空安全类型和非空安全类型,两者的相互赋值关系如下: 非空安全类型的变量可以 赋值给空安全类型变量,空安全类型的变量不能赋值给可空安全变量,代码示例如下:

kotlin 复制代码
var ame: String = "Kotlin"

name = null   //报错:name为非空安全变量,不能赋值为可空

var user : String? = null

user = name  //非空安全类型可以赋值给空安全类型

2.便捷的可空链式调用判断

在java中,如果判断多层多个变量是否可空,会形成嵌套地狱,如:

java 复制代码
Integer length = null;
if (user != null) {
    Profile profile = user.getProfile();
    if (profile != null) {
        String name = profile.getName();
        if (name != null) {
            length = name.length();
            //...
        }
    }
}

而kotlin中,可以对进行优雅链式调用:

kotlin 复制代码
 // 如果user、profile、name中任何一个为null,整个表达式直接返回null
val length = user?.profile?.name?.length 

3.Elvis操作符

Elvis操作符的作用,说白了就是为 null 值提供备胎方案​​,相当于说:"如果左边是 null,就用右边的值"。

对于Elvis操作符,有以下用法:

给 null 找备胎
kotlin 复制代码
//未简化操作
val name: String? = null
val displayName: String = if (name != null) name else "匿名用户"

//用 Elvis 操作符简化
val displayName = name ?: "匿名用户"
配合安全调用链(?.)处理多层空值
kotlin 复制代码
// 获取用户的城市名称,若任何一级为null则返回"未知地区"
val city = user?.address?.city ?: "未知地区"
快速抛出异常
kotlin 复制代码
// 强制要求关键数据不为null
val apiKey = config.apiKey ?: throw IllegalStateException("API密钥未配置!")
简化对象初始化
kotlin 复制代码
// 缓存未命中时创建新实例
val cachedData = memoryCache.get(key) ?: database.load(key)

PS:!! 非空断言

当你确定一个变量一定不为空的时候,可以使用非空断言对变量进行操作,但是这个操作没有风险的前提是:一定要保证操作的变量不为空!否则会抛出异常。

kotlin 复制代码
val risky: String = nullableValue!! // 如果nullableValue是null,当场NPE!

对空安全的总结

Kotlin 的空安全机制通过严格的类型系统(区分可空 ? 和非空类型)和智能操作符(?.、?:、!!),​​将空指针风险从运行时提前到编译期拦截​​,从根本上减少 NullPointerException 崩溃。它让代码更简洁、更安全、更易维护,逻辑一目了然,同时完美兼容 Java 的混乱空值状态。

相关推荐
JMchen1238 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
儿歌八万首12 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-194314 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
有位神秘人14 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs14 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&14 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
golang学习记14 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
gjxDaniel2 天前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
野生技术架构师3 天前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
言之。3 天前
Kotlin快速入门
android·开发语言·kotlin