可空类型与非空类型的定义
- 非空类型:在 Kotlin 中,默认情况下声明的变量为非空类型,即该变量不能赋值为
null
。例如:
val nonNullable: String = "Hello"
// nonNullable = null // 这行代码会报错,因为 nonNullable 是不可为空的
- 可空类型:当变量可能为
null
时,需要在类型后面加上 ?
来声明为可空类型。例如:
var nullable: String? = "World"
nullable = null // 这是允许的,因为 nullable 是可空类型
使用场景
- 非空类型:适用于变量在任何情况下都不会为
null
的场景,这样可以避免空指针异常,提高代码的安全性和稳定性。比如一个表示人的姓名的变量,正常情况下姓名不能为空。
- 可空类型:适用于变量可能为空的场景,例如从数据库查询数据时,某些字段可能没有值,此时用可空类型来表示这些可能为空的数据比较合适。
安全处理可空类型数据的方法
- 安全调用操作符(?.):如果对象可能为空,使用安全调用操作符调用对象的方法或访问属性时,如果对象为
null
,不会抛出空指针异常,而是返回 null
。
val nullableStr: String? = null
val length = nullableStr?.length // length 为 null
- Elvis 操作符(?:):用于提供一个默认值,当可空对象为
null
时使用默认值。
val nullableStr: String? = null
val result = nullableStr?.length?: 0 // 当 nullableStr 为 null 时,result 为 0
- 非空断言操作符(!!):使用
!!
操作符将可空类型转换为非空类型,但如果对象实际为 null
,会抛出 NullPointerException
。应谨慎使用。
val nullableStr: String? = null
// val length = nullableStr!!.length // 这里会抛出 NullPointerException
let
函数:结合安全调用操作符使用,在对象不为 null
时执行代码块。
val nullableStr: String? = "test"
nullableStr?.let {
val length = it.length
println("Length is $length")
}