安全调用操作符(?.)
- 工作原理:安全调用操作符用于在对象可能为空的情况下调用其方法或访问其属性。如果对象为空(
null
),则整个表达式返回null
,而不会抛出NullPointerException
。
- 应用场景:当需要处理可能为空的对象时,使用安全调用操作符可以优雅地处理空值情况,避免程序崩溃。常用于链式调用,当链式中的某个对象可能为空时,确保后续调用不会因空指针而失败。
- 代码示例:
data class Person(val name: String?)
fun main() {
val person: Person? = null
// 使用安全调用操作符
val length = person?.name?.length
println(length) // 输出: null
}
非空断言操作符(!!)
- 工作原理:非空断言操作符用于明确告诉编译器,该对象不可能为空。如果对象实际上为空,会抛出
NullPointerException
。它会强制将可空类型转换为非空类型。
- 应用场景:当你非常确定对象在运行时不会为空,但由于类型系统的原因被声明为可空类型时,可以使用非空断言操作符。不过这种情况应该谨慎使用。
- 使用风险:如果对象实际上为空,使用
!!
会导致NullPointerException
,这可能会使程序在运行时崩溃,尤其是在生产环境中,这种崩溃很难调试。
- 代码示例:
data class Person(val name: String?)
fun main() {
val person: Person? = null
// 使用非空断言操作符,这里会抛出NullPointerException
val length = person!!.name!!.length
println(length)
}