Kotlin空指针安全

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编译时可以通过 但运行时会报空指针异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值