接前文 Kotln笔记22–可空类型系统_南国樗里疾的博客-CSDN博客
https://blog.csdn.net/weixin_44021334/article/details/118161619
为了预防空指针异常,要判空。
Kotlin 中有判空辅助工具。常用的是 ?.
和 ?:
?.
操作符 ?.
的意思是当对象不为空时正常调用,为空时什么都不做。
修改前,
fun doStudy(study: Study?){
if (study != null){
study.readBooks()
study.doHomeWork()
}
}
修改后,
fun doStudy(study: Study?){
study?.readBooks()
study?.doHomeWork()
}
观感上就是省去了 if 判断。但是能省就省嘛,能少些就不多写。
?:
接着来。
学下 ?:
操作符,左右两边各接收一个表达式,
如果左边表达式不为空,就返回左边表达式的结果 ;
如果左边表达式为空,就返回右边表达式的结果 。
简单示例,
val a = 10
val res = a > 5 ?: 0
println("res=$res")
运行结果,
res=true
混合使用
混合使用试试。
写一个简单的方法,用来获取字符串长度,一般写法,
fun getStringTextLength(stringText: String?):Int{
if (stringText != null) {
return stringText.length
}
return 0
}
使用操作符简化下,
fun getStringTextLength(stringText: String?):Int{
return stringText?.length ?: 0
}
温习下之前的函数语法糖,
当一个函数只有一行代码时,不必编写函数体,可以直接将唯一的一行代码写在函数末尾,用等号连接。
基于 Kotlin 优秀的类型推导机制, stringText.length 的返回值是 Int 型,这样,就不用再显示声明函数的返回值了。
于是有,
fun getStringTextLength(stringText: String?) = stringText?.length ?: 0
非空断言工具
Kotlin 对空指针异常的判断放在编译时期,编译的时候就检查了,如果有空指针异常的风险,直接编译报错,降低了空指针异常的情况。
但如果我们对可能有空指针异常的代码,强行要编译过,可以使用 非空断言工具,写法是在对象后面加上 !!
。
当然,这种做法不好,需谨慎!!!
例子,
fun main() {
var test = "home"
if (test != null){//注释1
printTextUp(test)
}
}
fun printTextUp(text:String?){
println(text.toUpperCase()) //注释2
}
注释2 处的代码报红,提示Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
,会编译不过。
虽然在 注释1 处做了判空处理,但是 printTextUp() 方法并不知道外部已经做了判空处理。
针对这种情况,要强行编译过,就使用 非空断言工具 ,改为,
fun printTextUp(text:String?){
println(text!!.toUpperCase())
}
注意,每次使用非空断言工具,都需要检查一下是否都做了空指针处理,同时思考下是不是有更好的做法,避免灯下黑。