处理 Comparable接口不严谨导致Comparison method violates its general contract!

本文主旨是记录问题解决过程

出错的日志
Shutting down VM
--------- beginning of crash
FATAL EXCEPTION: main
Process: com.gezbox.deliver, PID: 25572
java.lang.IllegalArgumentException: Comparison method violates its general contract!
AndroidRuntime:     at java.util.TimSort.mergeLo(TimSort.java:773)
AndroidRuntime:     at java.util.TimSort.mergeAt(TimSort.java:510)
AndroidRuntime:     at java.util.TimSort.mergeForceCollapse(TimSort.java:453)
AndroidRuntime:     at java.util.TimSort.sort(TimSort.java:250)
AndroidRuntime:     at java.util.Arrays.sort(Arrays.java:1523)
AndroidRuntime:     at java.util.Collections.sort(Collections.java:238)
AndroidRuntime:     at com.zzz.XXXFragment.refreshDate(XXXFragment.java:203)
AndroidRuntime:     at com
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"comparison method violates its general contract"是一个错误消息,通常在Java中使用Comparable或Comparator接口进行对象比较时出现。这个错误消息表示实现了Comparable或Comparator接口的类的比较方法违反了其约定。 在Java中,当我们实现Comparable接口时,需要重写compareTo方法;当我们使用Comparator接口时,需要重写compare方法。这些方法用于定义对象之间的比较规则。 当出现"comparison method violates its general contract"错误消息时,意味着比较方法的实现不符合比较的一般约定。这些约定包括: 1. 自反性(Reflexivity):对于任何非null的引用值x,x.compareTo(x)应该返回0。 2. 对称性(Symmetry):对于任何非null的引用值x和y,如果x.compareTo(y)返回0,则y.compareTo(x)也应该返回0。 3. 传递性(Transitivity):对于任何非null的引用值x、y和z,如果x.compareTo(y)返回0,并且y.compareTo(z)返回0,则x.compareTo(z)也应该返回0。 4. 一致性(Consistency):对于任何非null的引用值x和y,如果没有修改x和y之间的比较信息,则多次调用x.compareTo(y)应该返回相同的结果。 5. 非空性(Non-nullity):对于任何非null的引用值x和y,x.compareTo(y)不应该抛出NullPointerException。 如果实现的比较方法违反了上述约定中的任何一条,就会出现"comparison method violates its general contract"错误消息。 为了解决这个问题,需要检查比较方法的实现,确保它满足上述约定。可能需要修复比较方法的逻辑或者处理特殊情况,以确保比较方法的正确性。 相关问题--: 1. 什么是Comparable接口和Comparator接口? 2. 如何实现Comparable接口和Comparator接口? 3. 如何避免"comparison method violates its general contract"错误?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值