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

相关推荐
橙子199110165 小时前
Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
java·开发语言·kotlin
橙子199110166 小时前
Kotlin 中的作用域函数
android·开发语言·kotlin
zimoyin6 小时前
Kotlin 懒初始化值
android·开发语言·kotlin
kebijuelun11 小时前
KV cache 缓存与量化:加速大型语言模型推理的关键技术
缓存·语言模型·kotlin
MyhEhud11 小时前
kotlin @JvmStatic注解的作用和使用场景
开发语言·python·kotlin
橙子1991101620 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin
androidwork20 小时前
Kotlin Android LeakCanary内存泄漏检测实战
android·开发语言·kotlin
zhangphil1 天前
Kotlin高阶函数多态场景条件判断与子逻辑
kotlin
每次的天空2 天前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
居然是阿宋2 天前
C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比
java·c语言·kotlin