0%

Kotlin空安全

可空类型

声明为可空类型:

1
var s: String? = null

使用可空对象

进行 null 检测

1
2
3
if (s != null) {
print(s.length())
}

在经过null检测后,会自动转为非null对象。

使用?.操作符

1
print(s?.length)

如果非null,则会计算s.length。如果为null,则返回null,不会报NullPointerException

可以链式调用:

1
response?.body()?.string()

配合let

1
2
3
4
val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
item?.let { println(it) } // 输出 Kotlin 并忽略 null
}

安全调用也可以出现在赋值的左边,如果为null,则不会赋值,右边也不会求值。

Elvis 操作符

1
val l = b?.length ?: -1

意思是如果b != null,求b.length,否则返回-1。当前仅当左侧为空时,才会对右侧求值。

!! 操作符

1
val l = b!!.length

使用!! 操作符意味着不再进行null检查,因此可能会NPE

类型转换

1
val aInt: Int? = a as? Int

这里如果a不是Int类型,则会返回null。使用as?可以避免ClassCastException

使用 filterNotNull()

1
2
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 时无法进行类型推断等;

参考

空安全 - Kotlin 语言中文站

Kotlin基本语法之(五)类型与空安全 - 简书

2020-3-23 20:53:41