ProphetRouter出现异常——The One 模拟器
ProphetRouter会遇到如下问题:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method
violates its general contract!
at java.util.TimSort.mergeHi(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeForceCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at routing.ProphetRouter.tryOtherMessages(ProphetRouter.java:241)
at routing.ProphetRouter.update(ProphetRouter.java:201)
at core.DTNHost.update(DTNHost.java:330)
at core.World.updateHosts(World.java:217)
at core.World.update(World.java:186)
at gui.DTNSimGUI.runSim(DTNSimGUI.java:115)
at ui.DTNSimUI.start(DTNSimUI.java:77)
at core.DTNSim.main(DTNSim.java:92)
是由于:ProphetRouter.java中的TupleComparator 引起的:
private class TupleComparator implements Comparator
<Tuple<Message, Connection>> {
public int compare(Tuple<Message, Connection> tuple1,
Tuple<Message, Connection> tuple2) {
// delivery probability of tuple1's message with tuple1's connection
double p1 = ((ProphetRouter)tuple1.getValue().
getOtherNode(getHost()).getRouter()).getPredFor(
tuple1.getKey().getTo());
// -"- tuple2...
double p2 = ((ProphetRouter)tuple2.getValue().
getOtherNode(getHost()).getRouter()).getPredFor(
tuple2.getKey().getTo());
// bigger probability should come first
if (p2-p1 == 0) {
/* equal probabilities -> let queue mode decide */
return compareByQueueMode(tuple1.getKey(), tuple2.getKey());
}
else if (p2-p1 < 0) {
return -1;
}
else {
return 1;
}
}
}
因为:java版本问题,java1.7使用TimSort,而TimSort发现comparable违反会抛出Comparable contract
IllegalArgumentException。
From http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Area: API: Utilities
Synopsis: Updated sort behavior for
ArraysandCollectionsmay throw anIllegalArgumentExceptionDescription: The sorting algorithm used by
java.util.Arrays.sortand (indirectly) byjava.util.Collections.sorthas been replaced. The new sort implementation may throw anIllegalArgumentExceptionif it detects aComparablethat violates theComparablecontract. 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.Nature of Incompatibility: behavioral
RFE: 6804124
因此,作如下修改:
在程序主函数加入一下一行代码:
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");

浙公网安备 33010602011771号