Exception:Comparison method violates its general contract!

本文介绍了一个在使用Java TimSort时出现的IllegalArgumentException异常问题,详细分析了错误原因,并提供了修复建议。错误发生在自定义比较器未能正确处理相同元素的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,数据后台查询一些数据时偶然出现这个漏洞,错误信息如下:

严重: Servlet.service() for servlet [springMVC] in context with path [/ice] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Comparison method violates its general contract!] with root cause
java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899)
    at java.util.TimSort.mergeAt(TimSort.java:516)
    at java.util.TimSort.mergeCollapse(TimSort.java:439)
    at java.util.TimSort.sort(TimSort.java:245)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at com.liyunet.service.functional.impl.IPDataMonitorServiceImpl.getIpDataByFetchedOrEnterpriseOrEvaluation(IPDataMonitorServiceImpl.java:160)

报错语句如下:

        infoVO.sort((IPInfoCompletionVO v1, IPInfoCompletionVO v2) -> v1.getDegreeOfCompletion()<v2.getDegreeOfCompletion()?1:-1);

,经百度得知,使用比较器时,在做比较的两个变量相同时应该返回0,如果不返回0,则在一些特殊情况下会造成排序出错。具体解释,这里就不列举了,下面是引用文章的链接
关于TimSort排序的原理解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值