可空类型
声明为可空类型:
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