JAVA异常:Comparison method violates its general contract

异常描述

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中则忽略了这种情况,那么新的约束是啥子?

  1. sgn(compare(x, y)) == -sgn(compare(y, x))
  2. ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0
  3. 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))约束。

解决方法

  1. JVM启动参数 增加 -Djava.util.Arrays.useLegacyMergeSort=true
  2. 改动compare函数
  3. 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; 
    }  
    }); 
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值