排序抛出java.lang.IllegalArgumentException:比较方法违反了其一般合同

时间:2014-03-10 14:10:48

标签: java

我有这个方法,它包含两个比较器,用于按价格对物品进行分类。

这种方法在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)

1 个答案:

答案 0 :(得分:5)

这是对Java7使用的TimSort算法的检查 - 它验证了您的比较器方法是否有效(例如symetric-a == b&amp;&amp; b == a)

你的equals大小写无效(返回0) - 如果一个元素为null,它取决于给定参数的顺序。尝试在执行任何其他操作之前显式处理空值,例如:

if(o1 == null || o2 == null)
{
    return 0;
}