Kotlin笔记23--判空辅助工具

36 篇文章 2 订阅
本文详细介绍了Kotlin中防止空指针异常的几种工具,包括?.操作符用于空安全调用,?:操作符进行条件判断,以及非空断言!!的使用。通过实例展示了如何在代码中有效防止和处理空指针异常,提高代码的健壮性。同时提醒开发者谨慎使用非空断言,避免潜在的运行时错误。
摘要由CSDN通过智能技术生成

接前文 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())
}

注意,每次使用非空断言工具,都需要检查一下是否都做了空指针处理,同时思考下是不是有更好的做法,避免灯下黑。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值