这是一个艰难的。客户通过崩溃报告向我发送了此堆栈跟踪信息。它没有提到我的应用程序的类,所以我很困惑于从哪里开始寻找。
我的应用是商业桌面应用。崩溃报告是匿名的,因此我无法轻易获得有关崩溃的更多信息。
编辑:一些谷歌搜索和线程跟踪使我得出结论,这是Java 1.7中的零星问题。寻找解决方案......
如何进行调试?
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(SortingFocusTraversalPolicy.java:136)
at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(SortingFocusTraversalPolicy.java:110)
at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(SortingFocusTraversalPolicy.java:435)
at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(LayoutFocusTraversalPolicy.java:166)
at javax.swing.DefaultFocusManager.getFirstComponent(DefaultFocusManager.java:120)
at javax.swing.LegacyGlueFocusTraversalPolicy.getFirstComponent(LegacyGlueFocusTraversalPolicy.java:132)
at javax.swing.LegacyGlueFocusTraversalPolicy.getDefaultComponent(LegacyGlueFocusTraversalPolicy.java:150)
at java.awt.FocusTraversalPolicy.getInitialComponent(FocusTraversalPolicy.java:169)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:380)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
答案 0 :(得分:2)
正如其他地方所指出的那样,正在排序的集合中的项目(可能包括或不包括您自己的类,无法从堆栈跟踪中判断出来)违反了比较合同。
在从Java 6过渡到Java 7期间,默认排序实现更改为TimSort。其中一个影响是新的排序对比较合同更加严格,所以你(或许是,Swing)可能已经很长时间没有了,但不再是。
如果无法解决比较合同的问题,可以通过使用属性启动应用程序来回滚以使用Java 6样式排序
-Djava.util.Arrays.useLegacyMergeSort=true
详见Java 7发行说明compatibility section。
答案 1 :(得分:1)
java.lang.IllegalArgumentException:比较方法违反了其一般合同!
我怀疑这意味着比较方法不是总排序。如同,它违反了所有排序方法必须具有的三个属性之一:
1)反身性 - 如果x == y,y == x。如果x> y,y< X
2)身份:x == x。
3)交互性:如果x> y和y> z,x> ž。
需要修正比较方法以遵守这些法律。当你看到它时,如何做到这一点还有待观察:)
答案 2 :(得分:1)
根据新的可比合同的规则,对于compareTo函数,给定规则必须始终为true。这些规则是在JDK 7中引入的-
实施者必须确保所有sgn(compare(x, y)) ==
-sgn(compare(y, x))
和x
的{{1}}。 (这意味着只有当compare(y,x)引发异常时,compare(x,y)才必须引发异常。
实现者还必须确保该关系是可传递的:y
暗示compare(x,z)> 0
最后,实现者必须确保((compare(x, y) > 0, (compare(y, z) > 0))
表示所有z的compare(x, y)==0
。
现在,似乎很显然这些规则将始终得到遵守,我们有很多例外。
考虑案例-代码中compareTo函数的实现-
sgn(compare(x, z)) == sgn(compare(y, z))
其中x和y为双精度。让我们考虑 return (int) (y - x)
,x = 2
这些值满足规则1和2,但对于规则3,请考虑y = 1.6
z = 2.4
因此,违反了合同。
答案 3 :(得分:0)
这是Oracle在Java中引入的有记录的错误。现在已修复。
我一直使用的解决方法是在应用启动后立即设置相关的系统属性:
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
此问题已在Java 8u40中修复,因此不再需要解决方法。
请参阅:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8048887