欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kotlin空指针安全

程序员文章站 2024-03-14 23:01:17
...

1.可为null类型

在Kotlin中通常我们直接定义的类型是不可以为null的,如下:

fun main() {
    var s = "abc"
    s = null  //编译错误:null can not be a value of a non-null type String

    var i = 1
    i = null  //编译错误:null can not be a value of a non-null type Int

    var p = Person("Denny")
    p = null  //编译错误:null can not be a value of a non-null type Person
}

如果想要允许为null,我们需要在变量的类型后面加上一个?号。如下:

fun main(args: Array<String>) {
    var s: String? = "abc"
    s = null

    var i:Int? = 1
    i = null

    var p:Person? = Person("Denny")
    p = null

    var list:MutableList<Int>? = mutableListOf(1, 2, 3)
    list = null
}

这样就不会编译报错了

2.安全调用

上面的例子中,如果调用s.length的话,这将是不安全的,编译器直接报错

private fun testNullSafe() {
    var s:String? = "safe"
    s = null
    println("lhf:  ${s.length}")
}

在println中的小点 . 会报这样的错误

(只有安全(2)或非空断言(.)调用才允许在类型为String的可空接收器上调用?)

当s为空时,返回null。如果s可能为空,使用s获取它的长度,有可能会导致空指针异常,为了解决这个问题,在s后面添加?号。
这样就可以保证不出现空指针异常。当s为空时,停止获取它的length,直接返回null。

所以:

private fun testNullSafe() {
    var s:String? = "safe"
    s = null
    println("lhf:  ${s?.length}")
}

使用双!!感叹号,代表的是当前字符串一定不为空,系统不会帮你检查了。

private fun testNullSafe() {
    s = "abc"
    println("lhf:  ${str!!.length}")
}

如果这里让s=null编译时可以通过 但运行时会报空指针异常