gpt4 book ai didi

java.lang.IllegalArgumentException : Comparison method violates its general contract (not reproducible)

转载 作者:行者123 更新时间:2023-12-01 07:10:07 24 4
gpt4 key购买 nike

我正在尝试重现此异常(java.lang.IllegalArgumentException:比较方法违反了其一般契约!),因为我需要调试一段代码,但下面的代码永远不会抛出它,

try {
ArrayList al = new ArrayList();
for (int i = 1; i <= 36; i++) {
TypeAdapterSort t = new TypeAdapterSort();
t.order = i;
al.add(t);
}
System.out.println(al.size());
Collections.sort(al, new Comparator() {
public int compare(Object o1, Object o2) {
TypeAdapterSort tas1 = (TypeAdapterSort) o1;
TypeAdapterSort tas2 = (TypeAdapterSort) o2;
if (tas1.order < tas2.order)
return -1;
else
return 1;
}
});

} catch (Exception e) {
System.out.println(e);
}

另外,当我检查JDK代码时,似乎只有当要排序的集合的大小大于32时,Collections.sort方法才会抛出此异常?应该在代码块中进行什么更改,以便 Collections.sort 抛出此异常。

最佳答案

这可能是你的问题

if (tas1.order < tas2.order)
return -1;
else
return 1;

如果顺序相等,您将得到不同的结果,具体取决于哪个先进入比较器,这是不正确的。

契约(Contract)类似于 if A < B and B < C then A < C,但在您的情况下,这可能会被破坏,具体取决于参数传递的顺序。

尝试类似的事情

return tas1.order -tas2.order;

这也解释了为什么您无法重现它,因为您的测试数据从来没有重复项。尝试在测试数据中添加一些重复项,看看是否可以重现(显然在应用修复之前......)

关于java.lang.IllegalArgumentException : Comparison method violates its general contract (not reproducible),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com