• 解决“Comparison method violates its general contract!”


    The ONE跑MaxProp、Prophet可能(取决于你JDK的版本)会报“java.lang.IllegalArgumentException: Comparison method violates its general contract!”错误,导致无法仿真。

    Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeLo(TimSort.java:747)
    at java.util.TimSort.mergeAt(TimSort.java:483)
    at java.util.TimSort.mergeCollapse(TimSort.java:410)
    at java.util.TimSort.sort(TimSort.java:214)
    at java.util.TimSort.sort(TimSort.java:173)
    at java.util.Arrays.sort(Arrays.java:659)
    at java.util.Collections.sort(Collections.java:217)
    at routing.MaxPropRouter.tryOtherMessages(MaxPropRouter.java:385)
    at routing.MaxPropRouter.update(MaxPropRouter.java:300)
    at core.DTNHost.update(DTNHost.java:342)
    at core.World.updateHosts(World.java:200)
    at core.World.update(World.java:171)
    at ui.DTNSimTextUI.runSim(DTNSimTextUI.java:29)
    at ui.DTNSimUI.start(DTNSimUI.java:77)
    at core.DTNSim.main(DTNSim.java:170)


    2. 问题原因
    产生该问题的原因是JDK1.6+要求所有比较器必须是可传递的(transitive),比如有A > B 和B > C,必须得保证有推出A > C(同理,对于=和<也需满足传递性)。而The ONE源码是基于JDK1.6的,JDK1.6没有该要求。

    3. 解决方法
    解决该问题至少有3种方法。

    (1)使用JDK1.6版本运行

    (2)修改The ONE源码,使其满足传递性

    只需要更改Router的比较器Comparator就可以了,比如MaxProp的MaxPropComparator:

    private class MaxPropComparator implements Comparator<Message> {
    ...
    }
    (3)重新编译源码

    加上一些选项,重新编译The ONE源码,使其能在JDK1.6+能正常运行[1]。

    方法一:在main函数第一行加入如下代码:

    System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
    方法2:编译时,加上选项-Djava.util.Arrays.useLegacyMergeSort=true,完整Java编译如下:

    java -Djava.util.Arrays.useLegacyMergeSort=true -d64 -Xms512m -Xmx4g -cp .:lib/ECLA.jar:lib/DTNConsoleConnection.jar core.DTNSim $*

    参考资料:
    https://stackoverflow.com/questions/13575224/comparison-method-violates-its-general-contract-timsort-and-gridlayout

  • 相关阅读:
    Oracle 循环语句
    IDEA---SpringBoot同一个项目多端口启动
    Maven引入oracle驱动包
    Linux安装 PostgreSQL
    Oracle备份及备份策略
    Oracle优化的几个简单步骤
    Oracle RMAN备份策略
    常见的几种索引扫描类型
    插槽内容
    分布式系统session同步解决方案
  • 原文地址:https://www.cnblogs.com/skyblue/p/8086185.html
Copyright © 2020-2023  润新知