CompareObj是java中的一个类,它由三个属性组成String rowKey、Integer hitCount、Long reency
public CompareObj(String string, Integer i) {
this.rowKey = string;
this.hitCount = i%10;
this.recency= (Long) i*1000;
}
现在我创建了一个treeMap
Comparator<CompareObj> comp1 = (e1,e2) -> e1.getHitCount().compareTo(e2.getHitCount());
Comparator<CompareObj> comp2 = (e1,e2) -> e2.getRecency().compareTo(e1.getRecency());
Comparator<CompareObj> result = comp1.thenComparing(comp2);
TreeMap<CompareObj, CompareObj> tM = new TreeMap<CompareObj, CompareObj>(result);
for(int i=0;i<=1000;i++)
{
CompareObj cO = new CompareObj("A"+i, i);
tM.put(cO,cO);
}
for(int i=0;i<=1000;i++)
{
CompareObj cO = new CompareObj("A"+i, i);
CompareObj values = tM.get(cO);
System.out.println(values.getRowKey()); // Line 28: get Null Pointer Exception
}
我还覆盖了 hashCode 和 Equals。我仍然遇到 nullponter 异常。
@Override
public int hashCode() {
return Objects.hash(getRowKey());
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;
if(!(obj instanceof CompareObj)) return false;
CompareObj compareObj = (CompareObj) obj;
return Objects.equals(this.getRowKey(), compareObj.getRowKey());
}
在这里,当我尝试从树形图中检索值时,我在提到的行中得到空指针异常。怎么解决这个问题
如果我想实现Comaprable接口(interface)的comapareTo(),如果有多个排序条件,我该如何实现。
最佳答案
首先要理解的是NullPointerException
。如果您在确切的行上遇到异常
System.out.println(values.getRowKey());
那么 System.out
或 values
为 null
。由于我们可以排除 System.out
为 null
,因此它是 values
变量,其中包含 get
和如果查找失败,则可为 null
。
由于您使用自定义的 Comparator
初始化 TreeMap
,因此 Comparator
会确定相等性。您的 Comparator
基于必须匹配的属性 getHitCount()
和 getRecency()
,这意味着当查找失败时, map 不会不包含与这两种方法报告的值相同的对象。
您表明您构造了具有相同值的对象,但没有这些 getter 的代码。一定有不一致的地方。如Misha pointed out ,您发布的代码不可能是您在遇到异常时运行的代码,因此我们无法进一步帮助您(除非您发布您运行的真实代码)。
关于java - 对象作为 java 8 中树状图中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30883232/