? 运算符
使用 ?
运算符:我们可以使用 ?
运算符来声明一个变量可以为空。例如,String?
表示一个可空的字符串类型。当我们使用一个可空类型的变量时,需要使用 ?.
运算符来调用它的属性或方法。例如:
val s: String? = null
val length = s?.length
在上面的示例中,我们声明了一个可空的字符串类型 s
,然后使用 ?.
运算符来获取它的长度。如果 s
是 null
,length
也会是 null
。
?.安全调用
在 Kotlin 中,?.
是安全调用运算符,用于解决空指针异常问题。该运算符可以用于对可空类型的属性或方法进行访问,如果对象为 null
,则返回 null
,否则返回对象的属性或方法的值。其语法如下:
object?.property
object?.method()
在上面的语法中,如果 object
为 null
,则返回 null
,否则返回 object.property
或 object.method()
的值。
下面是一个使用 ?.
运算符的示例:
val str: String? = null
val length = str?.length
在上面的示例中,我们使用 ?.
运算符获取一个可能为空的字符串变量 str
的长度。如果 str
是 null
,则 length
的值也会是 null
,否则会返回字符串的长度。
需要注意的是,?.
运算符只能用于可空类型,不能用于非空类型。如果我们确定一个变量不为空,可以使用非空断言运算符 !!
,但需要注意使用时可能会出现 NullPointerException
异常。因此,在使用 !!
运算符时需要谨慎。
!!非空转化
使用 !!
运算符:我们可以使用 !!
运算符将一个可空类型的变量强制转换为一个非空类型。如果变量的值为 null
,则会抛出一个 NullPointerException
异常。例如:
val s: String? = null
val length = s!!.length
在上面的示例中,我们使用 !!
运算符将一个可空类型的变量 s
强制转换为一个非空类型,并获取它的长度。如果 s
是 null
,则会抛出一个 NullPointerException
异常。
?:提供默认值
使用 Elvis 运算符:Elvis 运算符 ?:
可以在变量为空时提供一个默认值。例如:
val s: String? = null
val length = s?.length ?: 0
在上面的示例中,如果 s
不是 null
,则获取它的长度;否则,length
的值为 0
。
as?安全转换
使用安全类型转换:我们可以使用安全类型转换 as?
将一个可空类型的变量转换为一个非空类型。如果变量的值为 null
,则返回 null
。例如:
val s: String? = null
val upper = s as? String?.let { it.toUpperCase() }
在上面的示例中,我们使用安全类型转换将一个可空类型的变量 s
转换为一个非空类型,并将其转换为大写字母。如果 s
是 null
,则 upper
的值也为 null
。
需要注意的是,正确地处理可能为空的值是 Kotlin 编程中的一个重要问题。在处理可能为空的值时,我们应该尽量避免使用 !!
运算符,因为它会抛出一个 NullPointerException
异常。相反,应该使用安全调用运算符 ?.
和 Elvis 运算符 ?:
来处理可能为空的值。