Kotlinkotlin中的空指针检查
Posted Rose J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlinkotlin中的空指针检查相关的知识,希望对你有一定的参考价值。
kotlin学习-空指针检查
1.Java
在java代码中,经常会有空指针报错,方法传参,对数据进行操作,或者调用集合,都有可能发生空指针,一般的操作是加一个判空处理
2.kotlin-可空类型系统
**在kotlin中,默认所有的参数和变量不可为空,**如果传空,则就会有空值的提示,也就是说kotlin将空指针异常提前到了编译时期,如果程序存在空指针异常,那么在编译的时候就会直接报错
可空类型系统就是在变量的 后面加一个?
例如:Int ?表示可空 的整型 Int就不能为空
fun main() {//伪代码
doStudy(null)
}
fun doStudy(study : Study?){
study.readBooks()
study.doHomework()
}
这里Study加了?,所以是允许传空值的,但是调用方法的时候可能会造成空指针异常,所以kotlin会提示报错,而我们只需要添加一个判空处理就好了,因为kotlin是不允许在这种情况下编译通过的
fun main() {
doStudy(null)
}
fun doStudy(study : Study?){
if(study ! =null){
study.readBooks()
study.doHomework()
}
}
3.判空辅助工具
1. ?.
?.这个操作符很好理解,就是当对象不为空时正常调用相应的方法,当对象为空时则什么都不做
例如:
if(a ! =null){
a.dosth
}
就可以换成
a?.dosth
简化之前的代码
fun doStudy(study : Study?){
study?.readBooks()
study?.doHomework()
}
2. ?:
这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就会返回左边表达式的结果,否则就返回右边表达式的结果
例如:
val c =if (a!=null){
a
}else{
b
}
简化之后就是
val c =a ?: b
结合起来用就是
例如:
fun getTextLenth(text:String?):Int{
if(text !=null){
return test.length
}
return 0
}
简化之后就是
fun getTextLenth(text:String?)=text?.length ?:0
先判空,为空就返回 0
3. !!
我们可以做此修改
val upperCase = content!!.toUpperCase()
在这里printUpperCase函数并不知道外部已经对content变量进行了非空检查,在调用toUpperCase()方法时,还认为这里存在空指针风险,从而无法编译通过
所以我们可以通过非空断言工具,就是在对象后面加上!!
这是一种有风险的写法
4.let
let是一个函数,这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中
例如:
fun main(){
obj.let{obj2 ->
//编写业务逻辑代码
}
}
obj其实就是obj2,这里是为了防止重名
回到之间的doStudy函数中
就是这这个
fun doStudy(study : Study?){
study?.readBooks()
study?.doHomework()
}
本来我们进行一次if判断就可以搞定,但是这里要用?.,所以对应的就是要进行两次判空操作
所以我们就可以结合let和?.来对代码进行优化
fun doStudy(study : Study?){
study?.let{stu ->
stu.readBooks()
stu.doHomework()
}
}
这里就是?.操作符表示对象为空时什么都不做,对象不为空就调用let函数,而let函数会将study对象本省作为参数传递到Lambda表达式中,此时的study对象肯定不为空了。
加上Lambda特性,当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可
fun doStudy(study : Study?){
study?.let{
it.readBooks()
it.doHomework()
}
}
最后就是,let函数是可以处理全局变量的判空问题的,而if判断语句则无法做到这一点。
var study : Study?=null
fun doStudy(){
if(study != null){
study.readBooks()
study.doHomework()
}
}
之所以这里报错,是因为全局变量的值随时都有可能被其他线程所修改,即使做了判空处理,仍然无法保证if语句中study变量没有空指针风险
以上是关于Kotlinkotlin中的空指针检查的主要内容,如果未能解决你的问题,请参考以下文章
setText时的空指针异常 - TextView [复制]
在检查空值时 onPostExecute 中的 AsyncTask 中的空指针异常