对象作为Java8中树映射中的键

对象作为Java8中树映射中的键,java,java-8,treemap,Java,Java 8,Treemap,CompareObj是java中的一个类,它由三个属性组成String rowKey、整数hitCount、Long-recenty public CompareObj(String string, Integer i) { this.rowKey = string; this.hitCount = i%10; this.recency= (Long) i*1000; } 现在我创建了一个树形图 Comparator<CompareObj> comp1

CompareObj是java中的一个类,它由三个属性组成
String rowKey、整数hitCount、Long-recenty

public CompareObj(String string, Integer i) {


    this.rowKey = string;
    this.hitCount = i%10;
    this.recency= (Long) i*1000;
}
现在我创建了一个树形图

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
    }
在这里,当我尝试从treemap返回值时,我在前面提到的行中得到Null指针异常。如何解决这个问题


如果我想实现Comaprable接口的comapareTo(),如果存在多个排序条件,我应该如何实现。

首先要了解的是
NullPointerException
。如果你在这一行得到了例外

System.out.println(values.getRowKey());
然后
System.out
values
null
。因为我们可以排除
System.out
null
,所以它是
values
变量,它包含
get
的结果,如果查找失败,它可以是
null

由于您正在使用自定义的
比较器
初始化
树映射
,因此
比较器
决定相等性。您的
比较器
基于必须匹配的属性
getHitCount()
getRecenty()
,这意味着当查找失败时,映射不包含与这两个方法报告的值相同的对象


您可以使用相同的值构造对象,但不使用这些getter的代码。一定有不一致的地方。因为,您发布的代码不能是获取异常时运行的代码,因此我们无法进一步帮助您(除非您发布您运行的真实代码)。

您的比较器可以更简单地实现为
比较(CompareObj::getHitCount)。然后比较(反向(比较(CompareObj::GetRecenty)))
如果
最近期
被声明为
长期
此。最近期=i*1000不应编译。请在编译和运行代码时粘贴代码。一旦
recenty
行被修复,代码就会正常运行:@Louis Wasserman:
比较(CompareObj::getHitCount)。然后比较(CompareObj::getrecenty,reversed())
@ManuJoy,转换为
Long
也不会编译。您应该强制转换为
long
或使用
long.valueOf(i*1000)
。同样,由于您的问题是关于运行时异常的,请完全按照编译和运行代码的方式粘贴代码。
System.out.println(values.getRowKey());