null - 零安全的好处

标签 null kotlin

我是 Kotlin 的新手,我读到它似乎是继轮子之后最好的发明。无论如何,这让我感到怀疑,当然是因为我没有理解这个概念所暗示的一切。

恢复我的理解,在我们有 NullPointerException 之前,非常清楚地知道代码中的某些问题以及问题发生的位置,而不是设置 null 的位置。无论如何,很明显我们可以在这里等到空指针返回,期望从回溯中了解发生了什么。每个人都已经这样做了,这是永远不可能找到的。

现在有了空指针安全,我们不再有这样的崩溃,只是部分代码不会在我们的应用程序中静默执行(当然,我们假设使用的引用不应该像以前那样为空) ,可能会导致奇怪的行为比之前的 NullPointerException 更难以理解,或者可能只是一些任务在有人意识到之前没有执行一个月。

这是 Null Pointer Safety 提供的好处吗?

最佳答案

我假设您来自 Java,您已经在其他地方看过一些解释,但并没有完全理解它们。因此,我不会试图给你一个全面的解释(你可以在其他地方找到),而是我会尝试明确空指针安全的核心思想。

有两点,如果你理解的话,应该足够清楚。首先,有两种不同的类型来表示您将在 Java 中建模为单一类型的想法:可空类型和不可空类型。举个例子,在 Java 中,您将字符串放在 String 中。对象,不关心字符串是否可以为空,在 Kotlin 中有两种类型:String?String .第一个接受 null 值(如 Java 等效项),但第二个不接受。因此,您可以在具有 ? 的类型中具有空值(例如 String?Int? ),但是对于您可以使用它们执行的操作有很多限制:基本上您只能使用 null 执行的操作,因为毕竟变量可能包含空值。因此,例如,没有调用方法。因此,在 Java 中,您可以在其上调用方法并获得 NullPointerException有时,在 Kotlin 中你不能调用任何方法。这并不是因为 Kotlin 的一些沉默行为,它比这简单得多:编译器不会让你这样做。试一下,你会发现程序没有编译通过。如果变量的类型为 String而不是 String?那么 Kotlin 将允许您从中调用方法。

因此,基本上没有空指针异常,因为您永远不能在可能为空的对象变量上调用方法。

但是,有时变量不为空:那么在变量不为空的情况下,如何调用变量上的方法呢?同样,答案很简单:您必须检查它。我的意思是,你必须使用 if将检查变量是否为空的指令(显式或隐式)。像“if (myVariable != null) {call method on variable} ”。因此,如您所见,Kotlin 编译器足够聪明,可以看到您使用了 if保证变量不为空的指令,因此它将允许您在 { 之间的 block 中调用变量上的方法和 } .换句话说,如果你的变量是 String?但你在 if 内检查变量不为空的 block ,Kotlin 会将其视为 String 类型的变量而不是 String?

当你谈到

some part the code which silently won't be executed

我猜您正在考虑一些具有隐式 if 的运算符在它们里面,就像 ?.运算符(operator)。如果你写

myVariable?.call()

大概意思

if (myVariable != null) { myVariable.call()}

因此,确实,如果变量为空,它会默默地“失败”。但是如果你使用同一种if,这与Java没有什么不同。 .换句话说,如果变量为 null,则不会发生任何事情,因为您已将其显式编码为这样。

关于null - 零安全的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536985/

相关文章:

Javascript document.getElementById ("id").value 在元素为空文本框时返回 null 而不是空字符串

kotlin - 我们可以模拟构造函数并检查其参数吗?

java - Servlet/Undertow - 访问 HttpServletRequest 和 HttpServletResponse

c++ - 指针和整数的模糊重载?

android - 如何在 Kotlin 中从字符串获取资源?

java - fragment 中的 OnClickListener 不再起作用

kotlin - 如果在 Kotlin 中修改了可变集中的元素,则无法删除它

Javascript nodeValue 返回 null

mysql - 如何根据没有数据的月份统计并选择所有记录

null - 您可以在 Scheme 中返回一个不会打印在列表中的值吗?