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

Java . lang . illegalargumentexception:比较法违反其通用契约?

闾丘文昌
2023-03-14

我发现了许多与此标题相关的重复问题,但没有一个与我的问题有关,因为我的问题无法通过崩溃追踪。我不断收到有关此标题的许多不同的崩溃。

检查此示例(仅在android 4上发生):

Fatal Exception: java.lang.IllegalArgumentException: Comparison method violates its general contract!
       at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:831)
       at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:449)
       at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:372)
       at java.util.ComparableTimSort.sort(ComparableTimSort.java:178)
       at java.util.ComparableTimSort.sort(ComparableTimSort.java:142)
       at java.util.Arrays.sort(Arrays.java:1970)
       at java.util.Collections.sort(Collections.java:1864)
       at android.view.ViewGroup$ChildListForAccessibility.init(ViewGroup.java:6872)
       at android.view.ViewGroup$ChildListForAccessibility.obtain(ViewGroup.java:6837)
       at android.view.ViewGroup.dispatchPopulateAccessibilityEventInternal(ViewGroup.java:2706)
       at android.view.View.dispatchPopulateAccessibilityEvent(View.java:5217)
       at android.view.ViewGroup.dispatchPopulateAccessibilityEventInternal(ViewGroup.java:2712)
       at android.view.View.dispatchPopulateAccessibilityEvent(View.java:5217)
       at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5177)
       at android.view.View.sendAccessibilityEventUnchecked(View.java:5159)
       at android.view.View.sendAccessibilityEventInternal(View.java:5136)
       at android.view.View.sendAccessibilityEvent(View.java:5105)
       at android.view.View.performClick(View.java:4649)
       at android.view.View$PerformClick.run(View.java:19438)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:146)
       at android.app.ActivityThread.main(ActivityThread.java:5602)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
       at dalvik.system.NativeStart.main(NativeStart.java)

我通过研究发现,这种情况发生在比较/排序时,而忽略了某个条件。同时,在我的代码中,我没有使用文档/示例中提到的比较或排序方法。

非常感谢任何建议。

共有1个答案

宰父霖
2023-03-14

好像是@bwt指出的AOSP的bug。

该错误是框架API的一部分:http://www . doc jar . com/html/API/Java/util/comparabletimsort . Java . html(第835行)

在这种情况下,Android的源代码中发生了一些错误,因为您构建布局的方式,特别是您组织视图组元素的方式。

如果它只发生在Android 4上,修复它的一种方法是将您的minSdk升级到至少5。另一种方法是实现一些人在问题跟踪器链接中描述的解决方案,这可能会导致您的应用程序失去一些可访问性功能。另一种可能性是试图找到一种不同的方式来组织不会崩溃的布局,但是由于导致崩溃的逻辑嵌入在AOSP中,这将超出您的控制范围,也许可以指望幸运。

我个人会进行minSdk升级,根据Google的说法,由于当今Android 4的用户数量,这对您的应用程序的影响非常小。

 类似资料:
  • 我有一个自己的,相对复杂的字符串比较器和一个庞大的字符串列表(~100个字符串,已经尝试减少,但问题不可重现),其中对它们进行排序会产生上述错误尝试使用Java 7排序。我想,规则 可能会被侵犯。找出违反合同的样品的最好方法是什么?

  • 我正在根据下面的比较器对集合进行排序。 这些值总是非空的。getOrderSendTime()对象属于java.util.Date类。 我知道这是一种传递性不一致,我认为这样的类不会有这样的问题。我搜索了未解决的问题,但没有找到有关该主题的任何问题。 有什么想法吗?

  • 有人能解释一下为什么我下面的比较器有时候会抛出上面的异常吗? 注意:myObject 中的 id 字段类型为 long。 解决方案: 基于@amit的回答

  • 我知道很多答案已经回答了我的问题。在我的代码中,异常说“比较方法违反了它的一般合同”,但我不知道我的比较方法如何违反了它的一般合同。这是我的代码:

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?

  • 我看到了很多关于这个问题的问题,并试图解决这个问题,但经过一个小时的谷歌搜索和大量的尝试&错误,我仍然无法修复它。我希望你们中的一些人抓住了这个问题。 知道吗?