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

出错的日志

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.zzz.XXXFragment$2.onSuccess(XXXFragment.java:152)
AndroidRuntime:     at com.zzz.XXXFragment$2.onSuccess(XXXFragment.java:147)
AndroidRuntime:     at com.gezbox.net.Callback.onResponse(Callback.java:79)
AndroidRuntime:     at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:754)
AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
AndroidRuntime:     at android.os.Looper.loop(Looper.java:165)
AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:6365)
AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883)
AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)

原因

  • JDK7中的Collections.Sort方法实现中,你的返回值需要严谨全面
  • 如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
  • 在在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性

代码使用的范例

说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同

对比代码一般是这样的结构,写一段放着看看

Collections.sort(dataList, new Comparator<PackageInfo>() {@Overridepublic int compare(PackageInfo item1, PackageInfo item2) {return xxxxx.compare(xxxxx);}
});

有个简单的解决办法

  • 找出所有的条件语句
  • 针对所有条件,列出所有的可能情况。然后遍历一遍,覆盖所有的路径

上代码

范例

Collections.sort(dataList, new Comparator<ProcessingOrderResponse.PackageInfo>() {@Overridepublic int compare(ProcessingOrderResponse.PackageInfo item1, ProcessingOrderResponse.PackageInfo item2) {if (TextUtils.equals(mContext.getResources().getString(R.string.task_order_return), item1.packageNo)) {return 1;} else if (TextUtils.equals(mContext.getResources().getString(R.string.task_order_return), item2.packageNo)) {return -1;} else {return item1.packageNo.compareTo(item2.packageNo);}}});

修改后的

Collections.sort(dataList, new Comparator<ProcessingOrderResponse.PackageInfo>() {@Overridepublic int compare(ProcessingOrderResponse.PackageInfo item1, ProcessingOrderResponse.PackageInfo item2) {if (TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return 0;} else if (!TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return 1;} else if (TextUtils.equals(mContext.getString(R.string.task_order_return), item1.packageNo)&& !TextUtils.equals(mContext.getString(R.string.task_order_return), item2.packageNo)) {return -1;} else {if (item1.packageNo.compareTo(item2.packageNo) > 0) {return 1;} else if (item1.packageNo.compareTo(item2.packageNo) == 0) {return 0;} else {return -1;}}}});

简单说明

这里有三个判断条件
两个TextUtil.equals 以及String.compareTo
解决思路是
想讲两个TextUtil.equals这的所有路径都遍历,得到4个状态,分别给出1,0,-1这几个返回值
剩下的String.compareTo也遍历一遍,给出1,0,-1三个返回值

网上找了一圈,本来想看看java的源码,结果。。。。没找到源码,有知道的朋友麻烦告诉我一下,在此先谢过

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

  1. java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...

    前言 上周线上的一段排序的java代码出现了一个Comparison method violates its general contract,在解决这个问题的途中学到了一些知识这里总结分享一下. 异 ...

  2. Collections.sort()排序使用TimSort排序报Comparison method violates its general contract 原因

    前段时间升级JDK后,之前的功能报java.lang.IllegalArgumentException: Comparison method violates its general contract ...

  3. Comparison method violates its general contract!

    最近项目中有许多地方用到了集合排序,不是自然排序,必须的自己实现排序逻辑了. java提供实现排序接口有两个Comparable与Comparator. 我简单理解: 1.Comparable接口是实 ...

  4. java异常:Comparison method violates its general contract解决

    就在五一放假的前一天凌晨,收到一个测试同学发来的消息,说有个接口访问出现了问题,页面如下: 第二天早上紧急查看了线上日志,发现确实是因为这个告警导致返回问题 通过这条堆栈信息查了一些资料 Compar ...

  5. fastjson 序列化问题:Comparison method violates its general contract

    fastjson 序列化问题:Comparison method violates its general contract 问题重现 今天在测试接口的时候,调用了Mybatis Plus 分页查询的 ...

  6. java.lang.IllegalArgumentException: Comparison method violates its general contract

    一.简介 本篇文章讨论ArrayList.sort方法报错: java.lang.IllegalArgumentException: Comparison method violates its ge ...

  7. android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题

    android  java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...

  8. 排序问题排查Comparison method violates its general contract!

    通过List.sort对元素进行排序,测试阶段没发现,在st测试的时候报了这个错误."Comparison method violates its general contract!&quo ...

  9. Comparison method violates its general contract 出现原因和解决方法

    错误如下: 代码如下: 刚开始运行,没有什么问题,当我数据量一大的时候,就开时抛出异常,然后一点点拆解,我发现 当nums1和nums2如下时,即list存在太多相同的数组就会抛出这个异常. int[ ...

最新文章

  1. CES Asia专题|微鹅展示无线充电,智能手机的无线充电时代何时来临?
  2. 习题:codevs 2822 爱在心中 解题报告
  3. opencv机器学习线性回归_机器学习入门1---简单线性回归
  4. Origin一键复制粘贴,也能批量更改图片格式
  5. 为什么读博士的人越来越多?博士毕业难度不是越来越大吗?
  6. 指针津逮--------浅谈从指针到“ref”
  7. GDCM:dicom文件固定方向的测试程序
  8. 库克:大家会爱上有史以来最出色的iPhone和Apple Watch
  9. android layout wrap_content,android-如果高度为WRAP_CONTENT,则不显示VideoVi...
  10. C++ 虚拟继承与虚基类
  11. 测试Live Write的发布功能
  12. 《华为交换机学习指南》学习笔记·一
  13. Fuzz:插桩技术入门
  14. 详解两个队列实现一个栈(python实现——经典面试题)
  15. 工作转正申请自我评价
  16. 2023最新健身俱乐部会员管理系统的设计与实现(毕业设计+论文+开题报告+运行)
  17. PNAS:睡眠的fMRI频谱特征
  18. 读书笔记:《钱穆-zg历代zz得失》
  19. StringBuffer(史上最详细)
  20. 3行代码完成时序建模,最新开源的时序算法发布!

热门文章

  1. P3243 [HNOI2015]菜肴制作(拓扑排序)
  2. CSGO C4D -CSGO模型导入C4D进行编辑 -如何制作CSGO定制图片
  3. 简报 | 网信办:区块链信息需提供商备案
  4. SpringBoot实战(十八):签到奖励实现方案(转载)
  5. 全球与中国室内运动地板市场深度研究分析报告
  6. 10个完美的WordPress空白主题
  7. 日本語を勉強する日記 十八回目
  8. 怎样提高抖音播放量和点击率
  9. 最小长度路线板排列问题
  10. Android手绘电子签名