【问题标题】:java.lang.IllegalArgumentException: Comparison method violates its general contract (not reproducible) [duplicate]java.lang.IllegalArgumentException:比较方法违反其一般合同(不可重现)[重复]
【发布时间】:2013-04-19 07:37:37
【问题描述】:

我正在尝试重现此异常(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 抛出此异常。

【问题讨论】:

  • 是的,这段代码在我不知道的数据集上抛出了异常。因为我只知道例外,我希望它被复制,以便我可以确定是什么类型的数据导致它发生。
  • @MarcoForberg 据我计算,它是the seventh
  • 是的。我提到的三次是我亲眼看到的;)
  • @Marco:我从来没有任何解决方案来重现这个异常,任何这样做的代码都会有很大的帮助!!

标签: java collections comparator


【解决方案1】:

这可能是你的问题

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

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

合同类似于 if A

试试类似的东西

return tas1.order -tas2.order;

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

【讨论】:

  • 感谢您的回复。我的问题是重现错误。为什么上面的代码没有抛出异常?。
  • @Mohan 编辑了我的答案,以描述在我看到您的评论前大约 2 秒复制它;-)
  • 谢谢约翰。但是,我已经尝试过重复数据,但从未出现异常。任何抛出此异常的代码都会有很大帮助!!。谢谢
  • 尝试以不同的顺序添加您的项目
【解决方案2】:

如果对象相等,则永远不会返回 0。库足够聪明,可以检测到这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多