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 [复制]

Kotlin小笔记kotlin中的空指针检查

在检查空值时 onPostExecute 中的 AsyncTask 中的空指针异常

方法 oncreateview 中片段中 listview.setadapter() 的空指针异常

服务器中的空指针异常