12
如果equals(null)代替抛出NullPointerException是一个坏主意吗?
合同equals与问候null,如下: 对于任何非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)不应该return false抛出一个好主意NullPointerException呢? 如果我们尽可能重写合同以改为anyObject.equals(null)始终抛出,那将是一个坏主意NullPointerException吗? 与比较 Comparable 相比之下,Comparable合同是这样说的: 请注意,null不是任何类的实例,并e.compareTo(null)应抛出NullPointerException,即使e.equals(null)回报false。 如果NullPointerException适合compareTo,为什么不适合equals呢? 相关问题 关于null的可比合同和比较合同 一个纯粹的语义论点 这些是Object.equals(Object obj)文档中的实际词语: 指示其他某个对象是否“等于”该对象。 什么是物体? JLS 4.3.1对象 一个对象是一个类的实例或阵列。 引用值(通常只是引用)是指向这些对象的指针,是一个特殊的null引用,它不引用任何对象。 从这个角度来说,我的论点非常简单。 equals测试其他对象是否“等于”this null参考没有给出其他测试对象 因此,equals(null)应该扔NullPointerException