Kotlin基础(8)-->空指针检查

作者: 大漠孤烟直_v | 来源:发表于2020-05-04 16:47 被阅读0次

一、可空类型系统

Kotlin默认所有的参数和变量都不可为空。
Int 表示不可为空的整型
Int? 表示可为空的整型
eg:

fun doStudy(study: Study?) {
        if (study != null) {
            study.doHomeWork()
            study.readBook()
        }
    }

有点啰嗦吧,别急,Kotlin还提供了一系列辅助工具帮我们作判空处理。

二、判空辅助工具

1. ?.操作符

表示当对象不为空的时候正常调用相应的方法,当对象为空的时候什么都不做。
使用 ?.操作符改变上面代码:

fun doStudy(study: Study?) {
        study?.doHomeWork()
        study?.readBook()
    }
2. ?:操作符

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

    //原代码
    var c = if (a != nul) a else b

    //使用?:操作符
    var c = a ?: b
3. !!操作符

Kotlin也不是特别的智能,有时候我们逻辑上已经将空指针异常处理了,单Kotlin编译器并不知道,那么这个时候还是会编译失败,比如以下例子:

var content: String? = "hello"
fun main() {
    if (content != null) {
        printUpperCase()
    }
}

fun printUpperCase() {
    val toUpperCase = content.toUpperCase()
    print(toUpperCase)
}

这段代码逻辑没问题,但是一定无法执行。因为printUpperCase()函数并不知道外部已经对content做了非空检查,所以在调用toUpperCase()时,还认为存在空指针方风险。
使用!!操作符:

fun printUpperCase() {
    val toUpperCase = content!!.toUpperCase()
    print(toUpperCase)
}

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

4. let函数

let既不是操作符也不是关键字,是一种函数。这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到lambda表达式中,示例代码:

obj.let { obj2 ->
  //编写具体的业务逻辑
}

obj与obj2是一个对象。
let函数配合?.操作符做空检查:

 fun doStudy(study: Study?) {
        study?.let { stu ->
            stu.readBook()
            stu.doHomeWork()
        }
    }

这样我们对study对象只做了一次非空判断就可以使用了。
优化之后:

 fun doStudy(study: Study?) {
        study?.let { 
            it.readBook()
            it.doHomeWork()
        }
    }

另外,let函数是可以处理全局变量的判空问题的。而if无法做到这一点。

相关文章

  • Kotlin基础(8)-->空指针检查

    一、可空类型系统 Kotlin默认所有的参数和变量都不可为空。Int 表示不可为空的整型Int? 表示可为空的...

  • Kotlin-空指针检查

    Kotlin搞空指针检查现象:java存在问题,大量的崩溃是空指针异常。原因:java的空指针异常是一种运行时异常...

  • Kotlin笔记 空指针检查

    Kotlin相较于java的一大优势就是可以减少空指针的出现,变量的type需要指定是否能为空,不带?的type不...

  • Kotlin-空指针检查

    1、空指针异常是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免。 1.1、调用参数的方法之前...

  • Kevin Learn Kotlin:空指针检查

    可空类型 当我们在声明方法时,如果允许在这个方法被调用的时候传给它 null 的实参,则需要显示地 在类型名称后面...

  • Kotlin之空指针检查以及Kotlin中的小魔术

    1、可空类型系统 Kotlin在编译时判空检查的机制几乎杜绝了空指针异常,虽然编译时判空机制有时候会导致代码变得比...

  • Kotlin 空指针

    针对空指针问题, Kotlin有专门的针对语法以避免问题。 可空类型 默认声明的变量是不能为 null 的,如果要...

  • Android应用常见Crash与对策(Kotlin)

    Crash原因 NullPointerException:Kotlin语法上控制空指针 IndexOutOfBou...

  • 表示空的事物

    [NULL] :表示基础类型指针为空 int *p = NULL; [nil] : 表示对象指针为空 id o...

  • Kotlin基础认识 (5)可空数据类型

    一、可空类型概念 Kotlin的非空类型设计能够有效防止空指针异常。 定义可空类型 二、使用安全调用运算符 (?....

网友评论

    本文标题:Kotlin基础(8)-->空指针检查

    本文链接:https://www.haomeiwen.com/subject/ichyghtx.html