如果 equals(null) 抛出 NullPointerException 是不是一个坏主意?

2024-02-09

的合同equals http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29关于null,如下:

对于任何非空参考值x, x.equals(null) should return false.

这是相当奇怪的,因为如果o1 != null and o2 == null,那么我们有:

o1.equals(o2) // returns false
o2.equals(o1) // throws NullPointerException

事实是o2.equals(o1) throws NullPointerException是一件好事,因为它提醒我们程序员的错误。然而,如果由于各种原因我们只是将其切换为o1.equals(o2),这只会“默默地失败”。

所以问题是:

  • 为什么这是一个好主意o1.equals(o2) should return false而不是扔NullPointerException?
  • 如果我们尽可能重写合同以便anyObject.equals(null)总是扔NullPointerException反而?

与比较Comparable

相比之下,这就是Comparable合同 http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html says:

注意null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException虽然e.equals(null)回报false.

If NullPointerException适合于compareTo,为什么不是为了equals?

相关问题

  • 关于空值的可比合同和比较合同 https://stackoverflow.com/questions/2858628/comparable-and-comparator-contract-with-regards-to-null

纯粹语义论证

这些是实际的单词Object.equals(Object obj) http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29文档:

表示是否有一些其他物体“等于”这个。

什么是对象?

JLS 4.3.1 对象 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1

An object is a 类实例或数组。

参考值(通常只是参考)是指向这些对象的指针,以及一个特殊的null参考,其中没有引用任何对象.

从这个角度来说我的论证其实很简单。

  • equals测试是否有一些其他物体是“等于”this
  • null参考文献没有给出其他物体为了测试
  • 所以,equals(null)应该扔NullPointerException

至于这种不对称性是否不一致的问题,我认为不是,我建议你参考一下这句古老的禅宗公案:

  • 问任何一个人是否和下一个人一样优秀,每个人都会说是。
  • 问任何一个人是否比任何人都优秀,每个人都会说“不”。
  • 如果问任何人是否和任何人一样好,你永远不会得到答复。

在那一刻,编译器顿悟了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 equals(null) 抛出 NullPointerException 是不是一个坏主意? 的相关文章

随机推荐