如何使用这个堆栈跟踪在Java中调试,而没有提到我自己的类?

时间:2013-01-22 05:22:05

标签: java swing

这是一个艰难的。客户通过崩溃报告向我发送了此堆栈跟踪信息。它没有提到我的应用程序的类,所以我很困惑于从哪里开始寻找。

我的应用是商业桌面应用。崩溃报告是匿名的,因此我无法轻易获得有关崩溃的更多信息。

编辑:一些谷歌搜索和线程跟踪使我得出结论,这是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)

4 个答案:

答案 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