记录一次 compareto使用异常 java.lang.IllegalArgumentException: Comparison method violates its general contract!
源代码 如下 刚开始执行运行都没有任何问题,上线后运行了一段时间也很平稳,但是在一次排查问题时发现这样一个报错,感觉很奇怪。根据日志定位报错的代码如下(感觉好像也没有什么问题)
@Override
public int compare(Integer o1, Integer o2) {
return o1.intValue()>o2.intValue()?1:-1;
}
刚看到这个地方报错时一头雾水 ,自己怎么测试也没有问题,后来百度发现看到博客上有一个例子,运行会报错,才开始认真的看待这个问题;
其实问题并不难理解,只是不够严谨;在jdk1.6时忽略这个异常 而1.8并没有忽略这个问题,如果违反了约束条件就会抛出llegalArgumentException异常;
而该方法报错违法的是 可传递性约束
比如: a>b, b>c 则 a>c 一定成立 , 当a=b时 b=c ,a=c 也一定成立
如果仅仅 返回1和-1 在算法上并不严谨
比如 当 a>b时 那么 compare(a,b)=1成立 ,对应的compare(b,a)=-1也成立 , 即 compare(a,b)= -(compare(b,a))
如果 a=b 那么 compare(a,b)=-1 而 compare(b,a)=-1 因此 compare(a,b)= -(compare(b,a))不成立 ;
所以正确的写法是补充返回0的情况
@Override
public int compare(Integer o1, Integer o2) {
return o1.intValue() > o2.intValue() ? 1 : o1.intValue() == o2.intValue()?0:-1;
}