异常描述
java.lang.IllegalArgumentException: Comparison method violates its general contract!
异常举例
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 > o2 ? 1 : -1;// 错误的方式
}
});
异常原因
JDK7的sort函数实现变了,与旧版本的不同,存在兼容问题,可以查看下自己的compare函数实现有木有问题
新版本中对比较有约束条件,如果违反了约束条件就会抛出llegalArgumentException异常,JDK6中则忽略了这种情况,那么新的约束是啥子?
- sgn(compare(x, y)) == -sgn(compare(y, x))
- ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0
- compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z
因此,上面的异常举例就有问题了
return x > y ? 1 : -1;
当x == y时,sgn(compare(x, y)) = -1,-sgn(compare(y, x)) = 1,这违背了sgn(compare(x, y)) == -sgn(compare(y, x))约束。
解决方法
- JVM启动参数 增加 -Djava.util.Arrays.useLegacyMergeSort=true
- 改动compare函数
-
Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // return o1 > o2 ? 1 : -1; return o1.compareTo(o2);// 正确的方式 //或者 return o1 >= o2 ? 1 : -1; } });