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

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

从劲
2023-03-14

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

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

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

共有3个答案

邴修远
2023-03-14

根据新的可比合约的规则,给定的规则必须始终为真,才能起作用。这些规则是在JDK 7中引入的-

>

  • 对于所有的xy,实现者必须确保sgn(比较(x, y)) == -sgn(比较(y, x))。(这意味着当且仅当比较(y, x)抛出异常时,比较(x, y)必须抛出异常。

    > < li>

    实施者还必须确保关系是可传递的:< code>((compare(x,y)

    最后,实现者必须确保compare(x,y)==0意味着sgn(compare,x))==sgn。

    现在,尽管看起来很明显,这些规则将永远被遵守,但我们有许多例外。

    考虑compareTo函数在代码中的实现

       return (int) (y - x)
    

    其中x

    这些值满足规则 1 和 2,但对于规则 3,请考虑 z = 2.4

    compare(x,y) = int(1.6-2)   = int(-0.4) = 0
    compare(x,z) = int(2.4-2)   = int(0.4) = 0
    compare(y,z) = int(2.4-1.6) = int(0.8) = 1.
    

    因此,违反了合同。

  • 松鸣
    2023-03-14

    java.lang.IllegalArgumentException:比较方法违反了它的一般约定!

    我怀疑这意味着比较方法不是完全排序。例如,它违反了所有排序方法必须具有的三个属性之一:

    1)自反性-如果x == y,y == x .如果x

    2) 恒等式:x == x。

    3)瞬态性:如果x

    需要固定比较方法以遵守这些定律。如何做到这一点还有待观察:)

    宋宏儒
    2023-03-14

    正如其他地方指出的那样,正在排序的集合中的项(可能包括也可能不包括您自己的类,无法从堆栈跟踪中辨别)违反了比较约定。

    在从 Java 6 到 Java 7 的过渡过程中,默认的排序实现更改为 TimSort。这样做的影响之一是,新的类型对比较合约更加严格,所以你(或者也许是 Swing)可能已经侥幸逃脱了很长时间,但现在已经没有了。

    如果无法解决比较协定的问题,可以通过使用属性启动应用程序,回滚到使用Java 6样式的排序

    -Djava.util.Arrays.useLegacyMergeSort=true
    

    详见 Java 7 发行说明,兼容性部分。

     类似资料:
    • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

    • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

    • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti

    • 问题内容: 我最近发现了一个导致NullPointerException的错误。使用标准slf4j语句捕获并记录该异常。下面的节略代码: 如您所见,没有任何幻想。但是,在我们拥有的所有异常日志记录语句中,仅此一条不会打印堆栈跟踪。它仅打印消息(表示为“ …”)和异常类的名称(java.lang.NullPointerException)。 由于对异常的堆栈跟踪是延迟加载的,因此我认为可能存在某种指

    • 我收到了simmilar帖子,但没有工作 我有android studio 2.3.1 gradle版本2.3.1 AppCompat-V7:25.3.1 分级(项目)

    • 问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。