面试题答案
一键面试可空类型
- 使用场景:当一个变量有可能为空时,就使用可空类型。例如,从数据库查询可能返回空值的情况,或者一个函数的返回值可能为空时。
- 注意事项:可空类型的变量在使用前必须进行空值检查,否则会导致编译错误。
- 示例:
var nullableString: String? = null
// 安全调用操作符(?.)
val length = nullableString?.length
// 如果nullableString为空,length为null,不会抛出空指针异常
非空断言
- 使用场景:当你非常确定一个可空类型的变量在某一时刻不会为空,但编译器无法自动推断时,使用非空断言。例如,在经过一系列空值检查后,确定变量不为空的情况下。
- 注意事项:如果在使用非空断言(!!)时,变量实际上为空,会抛出
NullPointerException
。所以要确保变量在使用!!
时确实不为空。 - 示例:
var nullableInt: Int? = 10
// 假设经过一些逻辑,确定nullableInt不为空
val result = nullableInt!! + 5
// 如果nullableInt为空,这里会抛出NullPointerException
安全调用操作符(?.)
- 使用场景:在调用可空类型变量的方法或属性时,使用安全调用操作符,这样当变量为空时,不会抛出空指针异常,而是返回
null
。常用于链式调用可空对象的方法。 - 注意事项:安全调用操作符返回值的类型取决于调用的方法或属性的返回类型,如果是可空类型,最终结果也是可空类型。
- 示例:
data class Person(val name: String?, val address: Address?)
data class Address(val city: String?)
val person: Person? = null
val city = person?.address?.city
// 如果person为空,或者person的address为空,city为null,不会抛出空指针异常
Elvis操作符(?:)
- 使用场景:与安全调用操作符结合使用,当可空类型变量为空时,提供一个默认值。常用于在获取可能为空的值时,希望有一个备用值的场景。
- 注意事项:Elvis操作符右侧表达式只有在左侧可空变量为空时才会执行。
- 示例:
var nullableValue: String? = null
val valueToUse = nullableValue ?: "default value"
// 如果nullableValue为空,valueToUse为"default value"
通过合理运用这些机制,可以在Kotlin项目中有效避免空指针异常,确保代码的健壮性。