📌  相关文章
📜  以可靠的 null 安全性运行 (1)

📅  最后修改于: 2023-12-03 15:22:04.001000             🧑  作者: Mango

以可靠的 Null 安全性运行

在编程中,Null 值经常会成为程序漏洞的根源。例如,尝试访问 Null 对象的属性会导致 Null 异常。这通常是由于不正确的代码实现而引起的,但这种问题可能不易发现,容易造成错误的行为。因此,Kotlin 引入了 Null 安全性作为其类型系统的一部分,以提高编写可靠代码的能力。

什么是 Null 安全性?

Null 安全性是指编程语言能够处理 Null 值,例如防止 Null 指针异常。在 Kotlin 中,Null 安全性是作为类型系统的一部分来实现的。在 Kotlin 中,每个变量都有一个可以为空或不能为Null的类型。类型后面加上了一个问号'?',表示该类型可以为空。

例如,下面的代码声明了一个 Null 安全的字符串变量:

val str: String? = null

这意味着变量在运行时可以是 Null。在使用该变量时,需要添加一个非空断言并进行 Null 检查:

if (str != null) {
    println(str.length)
}

这个检查非常重要,因为如果变量是 Null,访问其属性将导致 Null 异常。通过进行 Null 检查,可以避免这种情况的发生。

可空类型的操作符

在 Kotlin 中,对于可空类型,使用一个安全调用操作符?. 可以避免 Null 异常。例如:

val str: String? = null
println(str?.length) // 输出 null

在上面的示例中,如果 str 是 Null,则该表达式的结果将是 Null,而不是引发 Null 异常。

有时需要对可空类型执行某个操作,并且只有在该类型不为 Null 时才执行。这可以通过 Elvis 操作符 ?: 实现:

val len = str?.length ?: -1 // 如果str为Null,则len为-1

在上面的示例中,如果 str 为空,len 的值将是 -1

非空类型断言

如果确定某个可空对象已经不为 Null,可以使用非空断言操作符 !! 来访问它的属性或方法。但是要注意,如果该对象为Null,则会引发异常。

val str: String? = null
println(str!!.length) // 抛出 Null 异常

在上面的示例中,我们对一个 Null 对象使用了非空断言操作符,结果抛出了 Null 异常。

安全类型转换

在 Kotlin 中,可以使用安全类型转换操作符 as? 将变量转换为某种类型。如果转换失败,变量将引用 Null。

val obj: Any? = "hello"
val str: String? = obj as? String

在上面的示例中,如果 obj 是字符串类型,转换将成功,str 变量将引用一个非空的字符串值。否则,str 变量将引用 Null。

总结

在 Kotlin 中,Null 安全性是类型系统的一部分,目的是提高代码的可靠性和安全性。使用可空类型、安全调用、非空断言和安全类型转换等操作符,可以避免 Null 异常和其他缺陷,并使代码更加健壮。