首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零安全效益

零安全效益
EN

Stack Overflow用户
提问于 2018-03-28 14:18:42
回答 5查看 3.4K关注 0票数 11

我是科特林的新手,我读到这似乎是继车轮之后最好的发明。无论如何,这让我产生了怀疑,当然,因为我不理解这个概念所暗示的一切。

为了继续我所理解的,在我们拥有NullPointerException之前,对于代码中的一些事情有一个非常清晰的想法是错误的,问题发生在哪里,而不是在哪里设置了null。不管怎么说,很明显,我们可以在这里等待空指针返回,希望了解从回退跟踪中发生了什么。每个人都已经这么做了,这从来都不是不可能找到的。

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

这是Null指针安全提供的好处吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-29 00:32:08

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

有两点,如果你能理解的话,应该说得很清楚。首先,有两个不同的类型来表示您在Java中将建模为单个类型的想法:可空类型和不可空类型。举个例子,在Java中,您将字符串放在String对象中,而不关心字符串是否为空,而在Kotlin中则有两种类型:String?String。前者接受空值(如Java等效值),但第二个则不接受。因此,您可以在带有?的类型中使用空值(比如String?Int?),但是对于这些类型可以做什么有很多限制:基本上,您只限于使用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,它将默默地“失败”。但是,如果使用相同类型的if,则这与Java没有什么不同。换句话说,如果变量为null,则不会发生任何事情,因为您显式地将其编码为那样。

票数 14
EN

Stack Overflow用户

发布于 2018-03-28 14:26:42

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

票数 5
EN

Stack Overflow用户

发布于 2018-03-29 01:37:45

为了给你一个简短的答案,你的理解是完全正确的。Kotlin没有解决NPE问题。它只是主动地强迫你做出一个明确的决定来阻止它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49536985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档