java错误Comparison method violates its general contract!

本文介绍在 JDK 7 中使用 Collections.sort() 方法时遇到的错误及其解决方案。该问题源于排序算法的变化,可能导致 IllegalArgumentException。文章提供了一种通过设置系统属性来恢复旧版排序行为的方法。

今天用到Collections.sort();方法时,提示错误如下:


网上查到一个解释:

Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation. If the previous behavior is desired, you can use the new system property, java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.

也就是说jdk 7的sort函数的实现变了,造成了这个问题,具体原因未知。

网上找了解决方法,如下

加入一句代码

<span style="font-size:14px;">System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");</span>

转载出处: http://blog.youkuaiyun.com/fanzitao/article/details/8040201

Java报错 "Comparison method violates its general contract!" 通常是排序方法的实现违反了 `Comparator` 的规则,对排序未处理 `null` 值一致性或传递性(transitivity)的要求,主要针对两值相等和两值都为 `null` 的情况未做正确处理。解决思路是保证两值互换比较时结果不会矛盾。以下是一些具体的解决办法: #### 处理两值相等的情况 在自定义 `Comparator` 时,如果没有正确处理两值相等的情况,会导致该报错。例如下面错误的实现: ```java Comparator<Integer> comparing1 = (o1, o2) -> { if (o1 > o2) { return 1; } else { return -1; } }; ``` 上述代码没有考虑 `o1` 等于 `o2` 的情况,修正后的代码如下: ```java Comparator<Integer> comparing1Fixed = (o1, o2) -> { if (o1 > o2) { return 1; } else if (o1 < o2) { return -1; } else { return 0; } }; ``` #### 处理两值都为 `null` 的情况 如果自定义 `Comparator` 没有正确处理两值都为 `null` 的情况,也会引发该报错。例如下面错误的实现: ```java Comparator<Integer> comparing2 = (o1, o2) -> { if (o1 == null) { return -1; } if (o2 == null) { return 1; } return o1.compareTo(o2); }; ``` 上述代码没有考虑 `o1` 和 `o2` 都为 `null` 的情况,修正后的代码如下: ```java Comparator<Integer> comparing2Fixed = (o1, o2) -> { if (o1 == null && o2 == null) { return 0; } else if (o1 == null) { return -1; } else if (o2 == null) { return 1; } return o1.compareTo(o2); }; ``` ### 总结 在自定义 `Comparator` 时,需要确保正确处理两值相等、两值都为 `null` 的情况,保证比较方法满足传递性、自反性和对称性等规则,避免出现 "Comparison method violates its general contract!" 报错 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值