当前位置: 首页 > 知识库问答 >
问题:

为什么不正确的比较器(Java)不抛出异常“比较方法违反一般合同”

苍阳成
2023-03-14

我认为下面的comprator实现是错误的。它会给我一个字符串的排序。但当我使用这个实现对List进行排序时,它不会抛出以下异常:“java.lang.IllegalArgumentException:Comparison方法违反了它的一般约定!”

问:为什么上面的异常不是由 Collections.sort(list, new WrongComparator()) 方法调用抛出的?

 public class WrongComparator implements Comparator<String> {

   public int compare(String o1, String o2){
     return 1;
   }
 }

共有1个答案

尹凌龙
2023-03-14

因为如果检测到它,就会引发IllegalArgumentException。这意味着,Collections.sort(..)不会对比较器进行特殊的检查,但是如果在排序过程中出错(因为比较器不好),就会抛出这个异常。Collections.sort()使用Tim排序算法,并在合并阶段结束时执行比较器检查。


因为根据您的比较器,您的集合已经排序。Tim的算法检测到它已经排序并且不执行任何合并。

 类似资料:
  • 对不起,又是一个问题,但我根本不明白这里发生了什么,或者我哪里出错了。 概述:我有一个包含多个-对象。它们有一个和一个。我想按以下条件对它们进行排序,优先级如下所列: 但是当这样做时,我得到以下错误: 我得到的:我在JavaFX项目中也有同样的事情发生,但是在那里我使用而不是。我需要转换为,因为显然Android还不支持方法。 这是启动排序和定义< code>Comperator的方法: 如您所见

  • 可能的重复: 为什么我的比较方法会抛出异常 — 比较方法违反了其一般合同! 我有这个代码: 有时它会引发以下异常: 为什么? 1) 我该如何避免呢?2) 我怎么能抓住这个例外? 提前谢谢。

  • 下面是导致异常的代码块, 代码: 例外情况: 当我运行与独立程序相同的代码时,问题永远不会发生。这里的比较器有什么问题?有没有办法在独立代码中重现该问题? 此问题仅在Java 1.7上发生,因为Arrays.sort上的实现已发生更改

  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 我使用了下面的代码,它抛出了一个IllegalArgumentException: 抛出异常: 这由以下函数调用: 它在我们的本地机器上运行良好,但在生产上失败了,我们无法连接到机器来找出原因。你能帮忙吗

  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误: