我正在编写代码,当时IntelliJ建议我进行以下更正:
objectOne.equals(objectTwo);
告诉我方法调用equals
可能会产生很好的旧java.lang.NullPointerException
,提出一些我不知道的Objects.equals解决方案:
Objects.equals(objectOne, objectTwo);
在阅读文档时,我仅看到一个潜在的问题,即如果objectOne == null
和objectTwo == null
,则结果为true
。
这时的问题是:我是否可以开始在所有地方代替此方法代替.equals
来使用和使用?
这是一种安全的方法还是我缺少一些重大禁忌症?
摆脱NPE非常吸引人... 谢谢
答案 0 :(得分:5)
此问题没有可靠的答案,因为这取决于程序的需求以及它应如何应对这种特殊情况。这样说,我会说:
如果具有空值是程序员的错误(我的意思是您永远不会期望在算法内部发生的事情),我建议您保留.equals方法,因为会出现空指针异常,并且让您注意到该问题,我的意思是程序员的错误(那些我们不想要的错误!,这意味着我们写错了算法),您应该感谢应用程序报告该错误(而不是生气的真实客户) ....)
但是,另一方面,如果您的应用程序也可以正常工作,而不是将其视为程序错误,那么使用Object.equals会更好地满足您的需求。
一般的看法建议,应该至少记录异常。
希望有帮助!
TD; DR;
尝试研究不同种类的异常。并非所有的异常都是程序员错误。
在Java中,通常,已检查的异常是针对所有您可以预期的事件的,您可以编写应该能够处理的代码。 未经检查的异常(属于RuntimeException家族的异常)用于您无法预料的事件(例如空指针异常),因此不可能编写代码来处理您不希望处理的事件期望(相反,您应该更正现有代码,而不是编写新代码!)
答案 1 :(得分:4)
如果要允许空值,这是一种适当的方法。否则,您可以只检查空值并适当地处理它们。
答案 2 :(得分:3)
取决于您的代码和“无处不在”的含义。如果您的代码当前假设(可能不是显式的,而是仅由于空输入将永远不会传播到equals
调用之下),则空输入将导致NPE,那么切换到Objects.equals
将引入一个错误。