- 处理可空变量以避免空指针异常
- 安全调用操作符(?.):
- 当调用可空变量的方法或访问其属性时,使用
?.
操作符。如果变量为null
,则表达式返回null
,而不会抛出空指针异常。
- 例如:
var nullableString: String? = "Hello"
val length = nullableString?.length
println(length) // 输出 5
nullableString = null
val newLength = nullableString?.length
println(newLength) // 输出 null
- Elvis操作符(?:):
- 结合安全调用操作符,在可空变量为
null
时提供一个默认值。
- 例如:
var nullableString: String? = null
val result = nullableString?.length?: -1
println(result) // 输出 -1
- 非空断言操作符(!!):
- 谨慎使用,它会在变量为
null
时抛出NullPointerException
。一般用于确定变量不可能为null
的情况下,强制将可空类型转换为非空类型。
- 例如:
var nullableString: String? = "Hello"
val length = nullableString!!.length
println(length) // 输出 5
nullableString = null
val newLength = nullableString!!.length // 这里会抛出 NullPointerException
- 结合不可变常量
- 不可变常量(val):在复杂业务逻辑中,使用
val
定义不可变常量,有助于提高代码的稳定性和可维护性。对于不可变常量,如果其类型可空,同样要按照处理可空变量的方式来避免空指针异常。
- 例如:
val constantNullableString: String? = "Constant String"
val length = constantNullableString?.length
println(length) // 输出 14
- 利用Kotlin类型系统特性优化代码结构
- 类型推断:Kotlin的类型推断机制可以减少代码中的类型声明冗余。在处理可空变量和不可变常量时,编译器能根据上下文推断出合适的类型。
- 例如:
val num: Int? = 10 // 明确声明可空Int类型
val num2 = 20 // 编译器推断为Int类型
- 智能类型转换:当Kotlin检测到一个可空变量在使用前已经进行了
null
检查,它会自动将其转换为非空类型,从而简化代码。
- 例如:
var nullableInt: Int? = 5
if (nullableInt != null) {
val result = nullableInt + 10 // 这里nullableInt自动转换为非空Int类型
println(result) // 输出 15
}