Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract

最近碰到一个异常,在使用Java内置APIjava.util.Collections#sort(java.util.List<T>, java.util.Comparator<? super T>)时,报了如标题所述异常,但其他同事的则不会出现;
异常抛出位置:
image

经排查,其他同事使用的是JDK6,我使用的是JDK8,而JDK8在这块做了变动,如果Comparator入参的实现违反了java.util.Comparator contract,则会报如标题所述异常;
通过询问Deepseek,找到了一个关于这块可做调整的选项(针对JDK8),即在JVM选项中添加系统参数java.util.Arrays.useLegacyMergeSort=true,则不会报异常了。

找到了关于此选项的相关Java-API的代码:
附上翻译:旧的归并排序实现可以通过系统属性进行选择(就目前破坏的比较器,兼容之前的)。由于存在循环依赖关系,不能在内部类中使用静态布尔值。将在未来的版本中移除。
image

但对java.util.Comparator contract具体内容不是很清楚

posted @ 2025-07-19 21:22  ct-group  阅读(194)  评论(0)    收藏  举报