写点什么

Kotlin 系列三:空指针检查,万字长文总结 Android 多进程

用户头像
Android架构
关注
发布于: 刚刚

}


2 判空辅助工具


========


2.1 ?.操作符




?.操作符:当对象不为空时正常调用相应的方法,当对象为空时则什么都不做(相当于外部包裹了 !=null 的一个判断了):


fun doStudy(study: Study?) {


study?.readBooks()


study?.doHomework()


}


2.1 ?:操作符




?:操作符:操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。


val c = if (a ! = null) {


a


} else {


b


}


这段代码的逻辑使用?:操作符就可以简化成:


val c = a ?: b


比如现在我们要编写一个函数用来获得一段文本的长度,使用传统的写法就可以这样写:


fun getTextLength(text: String?): Int {


if (text != null) {


return text.length


}


return 0


}


改进:


fun getTextLength(text: String?) = text?.length ?: 0


2.2 !!操作符




不过 Kotlin 的空指针检查机制也并非总是那么智能,有的时候我们可能从逻辑上已经将空指针异常处理了,但是 Kotlin 的编译器并不知道,这个时候它还是会编译失败。


观察如下的代码示例:


var content: String? = "hello"


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


fun main() {


if (content != null) {


printUpperCase()


}


}


fun printUpperCase() {


val upperCase = content.toUpperCase()


println(upperCase)


}


看上去好像逻辑没什么问题,但这段代码一定是无法运行的。因为 printUpperCase()函数并不知道外部已经对 content 变量进行了非空检查,在调用 toUpperCase()方法时,还认为这里存在空指针风险,从而无法编译通过。在这种情况下,如果我们想要强行通过编译,可以使用非空断言工具,写法是在对象的后面加上!!,如下所示:


fun printUpperCase() {


val upperCase = content!!.toUpperCase()


println(upperCase)


}


这种写法意在告诉 Kotlin,我非常确信这里的对象不会为空,所以不用你来帮我做空指针检查了,如果出现问题,你可以直接抛出空指针异常,后果由我自己承担。


2.3 let 函数




let 函数属于 Kotlin 中的标准函数,这个函数提供了函数式 API 的编程接口,并将原始调用对象作为参数传递到 Lambda 表达式中。示例代码如下:


obj.let { obj2 ->


// 编写具体的业务逻辑


}


结合 doStudy()函数:


fun doStudy(study: Study?) {


study?.readBooks()


study?.doHomework()


}


虽然这段代码我们通过?.操作符优化之后可以正常编译通过,但其实这种表达方式是有点啰嗦的,如果将这段代码准确翻译成使用 if 判断语句的写法,对应的代码如下:


fun doStudy(study: Study?) {


if (study != null) {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Kotlin系列三:空指针检查,万字长文总结Android多进程