用Objects.equals()替换.equals()

时间:2018-09-20 15:26:04

标签: java

我正在编写代码,当时IntelliJ建议我进行以下更正:

objectOne.equals(objectTwo);

告诉我方法调用equals可能会产生很好的旧java.lang.NullPointerException,提出一些我不知道的Objects.equals解决方案:

Objects.equals(objectOne, objectTwo);

在阅读文档时,我仅看到一个潜在的问题,即如果objectOne == nullobjectTwo == null,则结果为true

这时的问题是:我是否可以开始在所有地方代替此方法代替.equals来使用和使用? 这是一种安全的方法还是我缺少一些重大禁忌症?

摆脱NPE非常吸引人... 谢谢

3 个答案:

答案 0 :(得分:5)

此问题没有可靠的答案,因为这取决于程序的需求以及它应如何应对这种特殊情况。这样说,我会说:

如果具有空值是程序员的错误(我的意思是您永远不会期望在算法内部发生的事情),我建议您保留.equals方法,因为会出现空指针异常,并且让您注意到该问题,我的意思是程序员的错误(那些我们不想要的错误!,这意味着我们写错了算法),您应该感谢应用程序报告该错误(而不是生气的真实客户) ....)

但是,另一方面,如果您的应用程序也可以正常工作,而不是将其视为程序错误,那么使用Object.equals会更好地满足您的需求。

一般的看法建议,应该至少记录异常。

希望有帮助!

TD; DR;

尝试研究不同种类的异常。并非所有的异常都是程序员错误。

在Java中,通常,已检查的异常是针对所有您可以预期的事件的,您可以编写应该​​能够处理的代码。 未经检查的异常(属于RuntimeException家族的异常)用于您无法预料的事件(例如空指针异常),因此不可能编写代码来处理您不希望处理的事件期望(相反,您应该更正现有代码,而不是编写新代码!)

答案 1 :(得分:4)

如果要允许空值,这是一种适当的方法。否则,您可以只检查空值并适当地处理它们。

答案 2 :(得分:3)

取决于您的代码和“无处不在”的含义。如果您的代码当前假设(可能不是显式的,而是仅由于空输入将永远不会传播到equals调用之下),则空输入将导致NPE,那么切换到Objects.equals将引入一个错误。