空安全的好处

fra*_*lbo 6 null kotlin

我是Kotlin的新手,我已经读过它似乎是继轮子之后最好的发明。无论如何,这使我感到怀疑,当然是因为我不了解该概念所隐含的一切。

继续我的理解,在我们NullPointerException对代码中的某些错误以及发生问题的位置但没有设置null的地方有如此清晰的认识之前。无论如何,很明显我们可以在这里等到空指针返回,以期了解回溯发生了什么。每个人都已经做到了,这绝非不可能。

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

空指针安全性提供的好处吗?

yol*_*ole 5

主要好处是可能导致 a 的代码NullPointerException 无法编译。当您获得“不会静默执行的部分代码”时,唯一的情况是您使用安全调用来处理潜在的可空性错误。这不是处理此类错误的唯一方法,也不是最有用的方法。


Eke*_*eko 5

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

有两点,如果您理解它们,应该使它足够清楚。首先,有一个想法,有两个单独的类型来表示您将在Java中建模为单一类型的模型:可为空的类型,而不为可为空的类型。举一个例子,在Java中,您将一个字符串放入String对象中,而不管字符串是否可以为null,在Kotlin中,您有两种类型:String?String。第一个接受空值(例如Java等效值),但是第二个不接受。因此,您可以在类型为?(如String?Int?),但是您对它们的操作有很多限制:基本上,您只能使用null进行操作,因为毕竟变量可能持有null值。因此,例如,无需对其调用方法。因此,在Java中,您可以在其上调用一个方法,而NullPointerException有时在Kotlin中,您不能调用任何方法。这不是因为Kotlin的某些无声行为,而是比这简单得多:编译器不允许您这样做。尝试,您将看到该程序无法编译。如果变量是类型String而不是类型,String?那么Kotlin将允许您从中调用方法。

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

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

当你谈论

某些部分的代码将不会被执行

我猜您正在考虑其中包含隐式运算符的某些运算符if,例如?.运算符。如果你写

myVariable?.call()

这大概意味着

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

因此,的确,如果变量为null,它将无声地“失败”。但是,如果使用相同类型的,这与Java没有什么不同if。换句话说,如果变量为null,则不会发生任何事情,因为您已明确将其编码为具有这种行为。