对Kotlin的 Null Safety 一直存在一个误解,以为不管怎样写,只要编译通过了,就不会出现空指针异常。直到这个异常出现后,才又认真的看了一遍其中的 Safe Calls,发现自己并没有深入理解其空指针安全。
举个例子:
var text = getText() //getText可返回null
//刚开始这样写
//if (text.contains("bc")) println("safe") //编译报错
//编辑器报错后,跟着提示一路fix后。
if (text?.contains("bc")!!) println("safe") //错误的想法:因为kotlin是空指针安全的,text为空时就不会执行contains方法。
以上代码,执行时就会抛出异常:
Exception in thread "main" kotlin.KotlinNullPointerException
怎么回事?空指针安全,现在不安全了!
其实编辑器报错时,已经很明确给了提示,应该对text做非空判断,然后再继续使用,但错误的理解了编辑器的提示修复功能,虽然解决了编辑器报错的问题,但把异常带到了运行时。
除了进行非空判断外,还可以继续使用Safe Calls来解决问题,就是和let结合起来使用,代码如下:
text?.let { //text不为空时,才会执行打印
print("safe");
}