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 的混乱空值状态。

相关推荐
XiaoLeisj4 小时前
Jetpack Compose 知识点
android·kotlin·android jetpack·compose
Kapaseker9 小时前
Compose SelectionState API — 主动控制文本选择
android·kotlin
小强闯江湖1 天前
不只是让 AI 写代码:ViewCompose 把 Android UI 做成了可编译、可渲染的闭环
android·人工智能·kotlin
bytebitx2 天前
MacOS 编译腾讯 Mars XLog 及使用(已16KB对齐)
kotlin·mac·apk
alexhilton3 天前
让架构边界变成可执行的测试
android·kotlin·android jetpack
数据治理自习室3 天前
AI 应用评测体系(GraphRAG)
android·大数据·人工智能·kotlin
名剑走天下4 天前
Android 面试题大全
android·kotlin
chjif4 天前
Android 设备管控开发实战:自定义 Launcher 如何只显示指定 App?
android·kotlin
非凡ghost4 天前
用 Kotlin 和 Jetpack Compose 重写的安卓视频播放器,原生体验有多流畅?
android·java·kotlin·音视频·软件需求
名剑走天下5 天前
android 面试题
kotlin