与Java任何引用都可以为null不同,Kotlin是空安全的,Kotlin中若产生空指针异常只会由下面几点造成
- 显示调用throw NullPointerExecption()
- 使用了!!操作符
- 数据没有初始化
- 与Java互操作时调用了Java代码中有关null的代码
Kotlin中有关空安全的操作符
安全调用操作符"?"
表示可以为空,可以与let一起使用,表示只对非空值操作
fun main() {
val list = listOf("zzx", "jane", null, "tracy")
for (item in list) {
item?.let { print("$it ") }
}
}
======结果======
zzx jane tracy
安全调用也可以出现在赋值操作的左侧,如果有任何一个接收者为空则会跳过赋值操作,右侧的表达式直接不执行
// 如果 `person` 或者 `person.department` 其中之一为空,都不会调用该函数:
person?.department?.head = managersPool.getManager()
Elvis操作符"?:"
下面代码表示如果b不为空就将b.length的值赋值给l,为空则将?:右边的-1赋值给l
val l = b?.length ?: -1
?: 右边也可以根return和throw
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
非空断言操作符"!!"
如果b为空会抛出空指针异常
val l=b!!.length
安全的类型转换
如果b转换为Int不成功则返回null
val a:Int?=b as? Int
filterNotNull过滤非空元素
fun main() {
val list = listOf("zzx", "jane", null, "tracy")
for (item in list.filterNotNull()) {
print("$item ")
}
}
======结果======
zzx jane tracy