排序抛出java.lang.IllegalArgumentException:比较方法违反其一般约定

排序抛出java.lang.IllegalArgumentException:比较方法违反其一般约定,java,Java,我有一个包含两个比较器的方法,用于按价格对项目进行排序 这在90%的情况下都很好,但有时它会在标题中抛出异常。有人知道为什么吗 void sort( Collections.sort(masterList, new Comparator<Item>() { @Override public int compare(Item o1, Item o2) { try { if (o1.getPriceLevel() == 99

我有一个包含两个比较器的方法,用于按价格对项目进行排序

这在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;
        }
    }
    }));
}

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

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

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

请张贴stacktrace,以便轻松找到准确的引用类型,即
null
if(o1 == null || o2 == null)
{
    return 0;
}