CompareObj是java中的一个类它由三个属性String rowKey, Integer hitCount, Long recency
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());
}
这里当我尝试从树形图中回溯值时,我在上面提到的行中得到Null Pointer异常。如何解决这个问题
如果我想实现Comaprable接口的comapareTo(),如果有多个排序条件,我应该如何实现。
答案 0 :(得分:2)
首先要理解的是NullPointerException
。如果你在确切的行上得到了那个例外
System.out.println(values.getRowKey());
然后System.out
或values
为null
。由于我们可以排除System.out
为null
,因此它是values
变量,其中包含get
的结果,如果查找失败,则可以是null
。
由于您使用自定义TreeMap
初始化Comparator
,因此Comparator
确定了相等性。您的Comparator
基于必须匹配的属性getHitCount()
和getRecency()
,这意味着当查找失败时,地图不包含具有与这些相同的值的对象两种方法。
您显示构造对象具有相同的值但不是这些getter的代码。必须存在不一致。作为Misha pointed out,您发布的代码不能是您在获取异常时运行的代码,因此我们无法帮助您(除非您发布您运行的真实代码)。