问题起因

今天公司内部的OA系统反馈了一个问题,报java.lang.IllegalArgumentException: Comparison method violates its general contract! 这个异常,郁闷中,从开始敲代码到现在也没看到过这个异常,先去找找日志吧。
image.png
然后找到问题代码
image.png
刚看到这的时候,大概猜到了问题的原因了,这里如果o2为null的话,程序要如何执行呢?

问题原因

JDK7及其以上的JDK的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。

在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort 会报 IllegalArgumentException 异常。
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。

解决方法

1)修改JVM的启动参数:-Djava.util.Arrays.useLegacyMergeSort=true (不推荐)
2)修改代码:要判断比较的元素为null的所有情况
image.png