我有这个方法,它包含两个比较器,用于按价格对物品进行分类。
这种方法在90%的时间内都能正常工作,但有时它会在标题中引发异常。任何人都知道为什么
void sort(
Collections.sort(masterList, new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
try {
if (o1.getPriceLevel() == 999 && o1.getPriceLevel() < o2.getPriceLevel()) {
return 1;
}
if (o2.getPriceLevel() == 999) {
return -1;
}
return Double.compare(o1.getPriceLevel(), o2.getPriceLevel());
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
});
//Null pointer happens on the line below
Collections.sort(masterList, Collections.reverseOrder(new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
try {
if (o1.getPriceLevel() == 999 || o2.getPriceLevel() == 999) {
return 1;
}
return Double.compare(o1.getPriceLevel(), o2.getPriceLevel());
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}));
}
编辑:stacktrace
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:743)
at java.util.TimSort.mergeAt(TimSort.java:479)
at java.util.TimSort.mergeCollapse(TimSort.java:406)
at java.util.TimSort.sort(TimSort.java:210)
at java.util.TimSort.sort(TimSort.java:169)
at java.util.Arrays.sort(Arrays.java:2038)
at java.util.Collections.sort(Collections.java:1891)
答案 0 :(得分:5)
这是对Java7使用的TimSort算法的检查 - 它验证了您的比较器方法是否有效(例如symetric-a == b&amp;&amp; b == a)
你的equals大小写无效(返回0) - 如果一个元素为null,它取决于给定参数的顺序。尝试在执行任何其他操作之前显式处理空值,例如:
if(o1 == null || o2 == null)
{
return 0;
}