可空类型
声明为可空类型:
var s: String? = null
使用可空对象
进行 null
检测
if (s != null) {
print(s.length())
}
在经过null
检测后,会自动转为非null
对象。
使用?.
操作符
print(s?.length)
如果非null
,则会计算s.length
。如果为null
,则返回null
,不会报NullPointerException
。
可以链式调用:
response?.body()?.string()
配合let
:
val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
item?.let { println(it) } // 输出 Kotlin 并忽略 null
}
安全调用也可以出现在赋值的左边,如果为null
,则不会赋值,右边也不会求值。
Elvis 操作符
val l = b?.length ?: -1
意思是如果b != null
,求b.length
,否则返回-1
。当前仅当左侧为空时,才会对右侧求值。
!! 操作符
val l = b!!.length
使用!!
操作符意味着不再进行null
检查,因此可能会NPE
。
类型转换
val aInt: Int? = a as? Int
这里如果a
不是Int
类型,则会返回null
。使用as?
可以避免ClassCastException
。
使用 filterNotNull()
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
会把非null
对象过滤出来。
还有可能 NPE
的情况
显示调用 throw NullPointerException()
;
使用了 !!
操作符;
与 Java 进行了互操作:
如 Java 调用 Kotlin 时传进了null
、如 Kotlin 调用 Java 时无法进行类型推断等;
参考
2020-3-23 20:53:41