Comparison method violates its general contract! 异常原因

项目运行期间出现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;// 错误的方式  
    }  
});  

查看代码写的本身是问题的,第4行没有考虑o1 == o2的情况,

这样在JDK6中运行是没有问题,但是在JDK7中就可能会出现上述异常。

原因是:这是因为JDK7底层的排序算法换了,而新的算法必须满足如下约束条件:

 

 

  • 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

简单点说,就是必须指明相等的情况下返回 0.

 

感谢大神,查看的CSDN博客原文如下:

Comparison method violates its general contract!

posted @ 2017-10-30 14:45  C_Guangjin  阅读(674)  评论(0编辑  收藏  举报