Kotlin刨根问底(一):你真的了解Kotlin中的空安全吗?(上)

简介: 行文结构:要点提炼(方便回顾) + 常规操作 + 源码层面摸索实现原理,内容部分摘取自:《Kotlin实用指南》

0x1、要点提炼


  • Kotlin中通过「非空类型」与「可空类型」来规避 NPE


  • 可空操作符「`?`」、安全调用操作符「`?.`」、非空断言运算符「`!!`」


  • Elvis操作符「`?:`」如果不为空返回它,否则返回另一个值;


  • 安全的类型转换「`as?`」


  • ?.let{}


  • 不是绝对的空指针安全:Kotlin调用返回空的Java代码;


  • Kotlin空安全的实现原理:




0x2、Kotlin里的空安全用法


NullPointerException(NPE),空指针异常,发生在运行时引用一个空对象的方法时会抛出


Java中常见的规避手段是:


在对象使用前进行判空:if (obj != null)


多层判空时显得不是很美观,而Kotlin中是「空安全」的:


编译期 就处理Null


空安全不是Kotlin特有的,其他很多编程语言也有,下面简述下Kotlin空安全的相关用法。


① 非空类型与可空类型


Kotlin中通过「非空类型」和「可空类型」来规避NPE,非空类型不能设置为Null值:



可空类型可以设置为Null值,在类型后加上 可空操作符(?) 即可,代码示例如下:  



可空类型,直接访问它的属性或方法,会报错:



可以通过 安全调用操作符(?.)非空断言运算符(!!) 来解决,代码示例如下:



运行结果如下



② Elvis操作符(?:)


三目条件运算符的简略写法:如果不是空,就返回它,否则返回另一个值。代码示例如下:



③ 安全的类型转换


Kotlin中可以使用as关键字来进行类型转换,而使用as?表示安全类型的转换。最常见的使用场合,后台接口返回一个参数,需要我们自己做下类型转换,直接用as的话,如果参数为null或者非String类型,就可能引发异常,如果用as? ,参数异常则不会转换,代码示例如下:



运行结果如下



④ ?.let{}


let函数除了可用于在同一个作用域下操作变量外(代码更优雅)外:


tvTitle.let {
    it.text = "标题"
    it.textSize = 18.0f
    it.gravity = Gravity.LEFT or Gravity.CENTER
    it.setOnClickListener {}
}


还可以用作做判null操作,比如下面这样的代码:



test我们已经设置了一个值,但是还是报错,添加上一个非空断言即可:



还有个更优雅的写代码方式,就是用2,修改后的代码如下:



另外?.let{}遍历集合会忽略null值,只对非null值执行操作;除此之外,还可以用集合操作函数filterNotNull过滤出非空元素。


相关文章
|
3月前
|
安全 Java 编译器
深入浅出:Kotlin 中的空安全机制
【8月更文挑战第31天】
59 0
|
5月前
|
安全 Kotlin
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
|
安全 Java Kotlin
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
132 0
|
安全 IDE JavaScript
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 是什么? 可以做什么? Android 官方开发语言从Java变为Kotlin,Java 有哪些问题? Kotlin的优点 Kotlin 特性(Features)
11580 1
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
|
安全 Java 编译器
Kotlin学历之空安全
Kotlin学历之空安全
99 0
Kotlin学历之空安全
|
安全 Java 编译器
【Kotlin 初学者】空安全与异常
在Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null。这使得在Java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。
368 0
【Kotlin 初学者】空安全与异常
|
安全 Java 编译器
Kotlin刨根问底(一):你真的了解Kotlin中的空安全吗?(下)
行文结构:要点提炼(方便回顾) + 常规操作 + 源码层面摸索实现原理, 内容部分摘取自:《Kotlin实用指南》
135 0
|
1月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
20 1
|
2月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
76 1
|
3月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
61 4