2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
很明顯,HashMap比較里面有沒有條目"dd":只"xx","xz","cx",和"ax"映射。這就是在等于時this.map.get(k1)產(chǎn)生的原因。nullk1"dd"
之后你調(diào)用compareTo結(jié)果get
this.map.get(k1).compareTo(this.map.get(k2));
// ---------
它產(chǎn)生一個 NPE。
要解決此問題,請?zhí)砑右恍┨娲椒▉肀容^映射中沒有鍵的對象 - 例如,通過比較鍵本身:
public int compare(String k1, String k2){
System.out.printf("k1:%s k2:%s\n",k1,k2);//for debugging
Integer v1 = this.map.get(k1);
Integer v2 = this.map.get(k2);
if (v1 != null && v2 == null) {
return -1;
}
if (v1 == null && v2 != null) {
return 1;
}
return (v1 != null && v2 != null) ? v1.compareTo(v2) : k1.compareTo(k2);
}

TA貢獻1851條經(jīng)驗 獲得超3個贊
問題出現(xiàn)在這里 return this.map.get(k1).compareTo(this.map.get(k2));
您已經(jīng)預定義了地圖,this.map=map;
但是如果您添加一個元素,則會調(diào)用比較器。但是由于該元素不在地圖上還this.map.get(k1)
返回null
。這就是為什么你得到null.compareTo(...)
導致異常的原因。
添加回答
舉報