使用Java稍不留神很容易导致NullPointException。Kotlin的类型系统使用可空类型(Nullable Type)旨在消除null引用导致的代码出错。
Kotlin要求我们必须检测可空类型的值,只有非null的值才允许访问。有几种方式来处理可空类型的值,以避免null引用的出现。
条件检查
var nullableStr?: String = "abc";
val len1= nullableStr.length; //错误,不允许直接访问可空类型
val len2 = if (nullableStr != null) nullableStr.length else -1 //检查nullableStr为非null。
安全调用符?.
val length = nullableStr?.length
如果nullableStr为null,那么返回null,否则返回length的值。
注意:返回类型也是可空值。这个例子返回的是Int?
在链式调用中的应用:
bob?.department?.head?.name
Elvis 操作符 ?:设置默认值
elvis操作符?:可以让我们对可空类型设置默认值。
val length = nullableStr?.length ?: -1
如果nullableStr为null则返回默认值-1,否则返回length的值。
!!操作符
!!操作符让我们确保了可空类型的引用为非空值,如果为null则抛出NullPointException。
val l = b!!.length
这个让我们清楚知道此处可能会抛出NullPointException,不像Java隐藏了NullPointException的可能。
转换为非空类型
只要确保可空类型的值为非空,即可直接赋值给非空类型。
如使用!!操作符
val nullableInt: Int? = 1
val nonNullableInt: Int = nullableInt!!
使用条件判断
val nullableInt: Int? = 1
if (nullableInt != null) {
val nonNullableInt: Int = nullableInt
}