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编译时可以通过 但运行时会报空指针异常
下一篇: C#——面向对象——泛型——泛型类