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

equals null的合同如下:

对于任何非空引用值xx.equals(null)应该return false

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

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

o2.equals(o1) throws NullPointerException是一件好事,因为它会提醒我们程序员错误。 然而,如果出于各种原因,我们只是将它切换到o1.equals(o2) ,那么这个错误就不会被o1.equals(o2) ,而这只会“沉默地失败”。

所以问题是:

  • 为什么o1.equals(o2)应该return false而不是抛出NullPointerException是一个好主意?
  • 如果可能的话我们重写契约,以至于anyObject.equals(null)总是抛出NullPointerException不是一个好主意?

  • Comparable

    相比之下,这是Comparable合同所说的:

    请注意, null不是任何类的实例,即使e.equals(null)返回falsee.compareTo(null)应抛出NullPointerException

    如果NullPointerException适用于compareTo ,为什么它不是equals

    相关问题

  • Comparable和Comparator关于null的合同

  • 纯粹的语义论证

    这些是Object.equals(Object obj)文档中的实际单词:

    指示其他某个对象是否“等于”这一个。

    什么是对象?

    JLS 4.3.1对象

    一个对象是一个类实例或一个数组。

    引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的null引用,它引用没有对象。

    从这个角度来看,我的观点非常简单。

  • equals测试某个其他对象是否“等于” this
  • null引用不给测试的其他对象
  • 因此, equals(null)应抛出NullPointerException

  • 对于这种不对称性是否不一致的问题,我不这么认为,我把这个古代禅宗称为:

  • 问任何人,如果他和下一个人一样好,每个人都会说是。
  • 问问任何人,如果他没有人,每个人都会说不。
  • 询问任何人是否和任何人一样好,你永远不会得到答复。
  • 那一刻,编译器达到了启发。


    一个例外确实应该是一个特殊的情况。 空指针可能不是程序员错误。

    你引用了现有的合同。 如果你决定违背惯例,毕竟这个时候,每个Java开发者都希望等于返回false,那么你会做出一些意想不到的,不受欢迎的事情,这会让你的班级变得贱民。

    我无法反驳更多。 我不会重写equals来抛出异常。 如果我是它的客户,我会替换那些做过的类。


    想想.equals如何与==相关,并且.compareTo与比较运算符>,<,> =,<=相关。

    如果你打算争论使用.equals来比较一个对象为null应该抛出一个NPE,那么你不得不说这个代码也应该抛出一个:

    Object o1 = new Object();
    Object o2 = null;
    boolean b = (o1 == o2); // should throw NPE here!
    

    o1.equals(o2)和o2.equals(o1)之间的区别在于,在第一种情况下,您将某些内容与null进行比较,类似于o1 == o2,而在第二种情况下,equals方法从未实际执行所以根本没有比较。

    关于.compareTo契约,比较非空对象和空对象就像尝试这样做:

    int j = 0;
    if(j > null) { 
       ... 
    }
    

    显然这不会编译。 您可以使用自动拆箱来进行编译,但在进行比较时会得到NPE,这与.compareTo合同一致:

    Integer i = null;
    int j = 0;
    if(j > i) { // NPE
       ... 
    }
    
    链接地址: http://www.djcxy.com/p/13311.html

    上一篇: Is it a bad idea if equals(null) throws NullPointerException instead?

    下一篇: What is a NullPointerException, and how do I fix it?