在 Java 中,hashCode 和 equals 方法中的异常是否允许和可接受?
一些由框架填充的类(如bean)。因此,您无法保证所有字段都已设置。
看个例子:标记为通常具有字段的类。 可以写成:@Entity
Integer id
hashCode
public int hashCode() {
return id.hashCode();
}
但防御性代码可能如下所示:
public int hashCode() {
return (id != null) ? id.hashCode() : 0;
}
我是否需要对带有 in 和 函数的 null 或环绕代码进行写入检查?try { ... } catch (Exception e)
hashCode
equals
我没有论据支持防御性编码就是这种情况,因为它隐藏了将不一致的对象放入集合并导致延迟错误。我在这个位置上错了吗?
更新我写了这样的代码:
import java.util.*;
class ExceptionInHashcode {
String name;
ExceptionInHashcode() { }
ExceptionInHashcode(String name) { this.name = name; }
public int hashCode() {
// throw new IllegalStateException("xxx");
return this.name.hashCode();
}
public static void main(String args[]) {
Hashtable list = new Hashtable();
list.put(new ExceptionInHashcode("ok"), 1);
list.put(new ExceptionInHashcode(), 2); // fail
System.out.println("list.size(): " + list.size());
}
}
并运行它:
java -classpath . ExceptionInHashcode
Exception in thread "main" java.lang.NullPointerException
at ExceptionInHashcode.hashCode(ExceptionInHashcode.java:12)
at java.util.Hashtable.hash(Hashtable.java:262)
at java.util.Hashtable.put(Hashtable.java:547)
at ExceptionInHashcode.main(ExceptionInHashcode.java:18)
我认为如果对象处于错误状态,我可以尽早发现错误,而不是返回零...