可空类型和不可空类型
提供方: JetBrains 学院
如果你熟悉 Java,你可能听说过 NullPointerException ( NPE )。如果你是第一次听说它,那你真是幸运,因为 NPE 是最常见的异常,它会让你非常头疼。而且,Java 中并没有什么便捷的方法来避免这种异常。幸运的是,Kotlin 提供了一种真正有效的 NPE 解决方案。不过,首先我们需要了解一种特殊的引用类型。
无效性
Kotlin 中出现 空指针异常 (NPE) 的 方式只有几种:
- 显式调用
throw NullPointerException(); !!语法;- 错误的初始化,例如构造函数和超类构造函数。
如果你对这些一无所知,也没关系。以后你会慢慢了解的。现在,你只需要记住,你不需要像在 Java 中那样关注空指针 异常 (NPE) ,你可以专注于实际任务。别忘了 Kotlin 是一门实用的语言。那么,我们有什么呢?
首先,Kotlin 中的每个引用都可以是可为空的,也可以是不可为空的。假设我们要定义一个字符串变量,但我们不确定它的初始值是什么:
var name: String = null
那么,上面的 null 是什么意思呢?它表示变量 name 没有特定的值。这段代码无法编译,因为我们声明了一个非空变量。如何解决这个问题呢?很简单:
var name: String? = null
如您所见,我们只需在变量类型后面添加一个 ? 即可。我们将 name 变量标记为可为空。我们也可以对其他类型(例如 Int 或 Long )执行相同的操作:
var age: Int? = null
所以,如果类型中没有 ? 就不能将 null 赋给变量。
访问可为空变量
现在试着猜猜如果你尝试访问这个变量属性会发生什么:
var name: String? = null
print(name.length)
如果你觉得会有错误,那就对了!这段代码根本无法编译。那我们该怎么办呢?当然,我们可以添加一个常见的 null 检查,像这样:
if (name != null) {
print(name.length)
}
如果 name 为空,则不会调用 print 。
或者我们可以通过以下方式获取长度:
print(name?.length)
这里打印的是 null 。
在 Kotlin 中,这对问号( ?. 被称为。我们将在专门的章节中深入探讨这个概念。现在,这些信息足够你练习了。
价值十亿美元的错误
因此,Kotlin 引入了可空类型,这与不可空类型有所不同。在 Java 等旧语言中,由于所有类型都是可空的,所以没有区别。因此,在许多语言中,访问可空变量之前无需检查其是否为 null 。这会导致大量程序崩溃。2009 年,发明了 null 引用概念的英国计算机科学家 Tony Hoare 将其描述为“”。
我称之为我价值十亿美元的错误。那是我在 1965 年发明的空引用。当时,我正在设计面向对象语言( ALGOL W )中第一个全面的引用类型系统。我的目标是确保所有引用的使用都绝对安全,并由编译器自动进行检查。但我无法抗拒添加空引用的诱惑,因为它实现起来实在太容易了。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年里,这些可能已经造成了十亿美元的损失。
结论
Kotlin 中有两种不同类型的引用。显然,对于非空类型,你无需像处理可空类型那样格外小心。务必谨慎使用引用,并尽量定义适合特定情况的类型。不过,也不用过于担心,因为大多数情况下编译器会指出你的错误。
407 名学习者喜欢这篇理论文章, 7 名学习者不喜欢。 你觉得呢?
报告拼写错误