在Java中允许和接受hashCode和equals方法中的异常?
一些类框架(如bean)填充的类.所以你不能保证所有的字段设置.
看看例子:标记为@Entity的类通常有Integer id字段. hashCode可以写成: public int hashCode() { return id.hashCode(); } 但defencive代码可能看起来像: public int hashCode() { return (id != null) ? id.hashCode() : 0; } 在hashCode和equals函数中尝试使用{…} catch(Exception e),需要对空或环绕码进行写入检查吗? 我没有任何辩护编码的理由是这样的情况,因为它隐藏将不一致的对象放在集合中并导致更迟的错误.我在这个位置错了吗? 更新我写了这样的代码: 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) 我认为我可以早期找到错误,而不是返回零,如果对象处于错误的状态… 解决方法
一般来说,答案是“依赖”.
>如果你不应该看到该字段的null类的实例,那么允许抛出一个NPE是合理的. NPE表示错误;即您的非正式不变量被破坏的情况. 在这种特殊情况下,如果对象尚未被持久化,那么您明显地处理了id字段可以为null的对象.这是一个棘手的问题: >如果你不允许空值为id,那么你必须小心,不要把非持久性对象放入散列表. 考虑到所有这一切,我建议要么抛出NPE,要么不使用id / hashcode中的id字段. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |