如果equals(null)抛出NullPointerException而不是它是一个坏主意?
equals
null
的合同如下:
对于任何非空引用值x
, x.equals(null)
应该return false
。
这是相当奇特的,因为如果o1 != null
和o2 == 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)
返回false
, e.compareTo(null)
应抛出NullPointerException
。
如果NullPointerException
适用于compareTo
,为什么它不是equals
?
相关问题
纯粹的语义论证
这些是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?