这是一个艰难的问题。一位客户通过崩溃报告向我发送了此堆栈跟踪。它没有提到我的应用程序的类,所以我对从哪里开始寻找感到困惑。
我的应用是商业桌面应用。崩溃报告是匿名的,所以我无法轻松获得有关崩溃的更多信息。
编辑:一些谷歌搜索和线程跟踪让我得出结论,这是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)
根据新的可比合约的规则,给定的规则必须始终为真,才能起作用。这些规则是在JDK 7中引入的-
>
对于所有的x
和y
,实现者必须确保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.
因此,违反了合同。
java.lang.IllegalArgumentException:比较方法违反了它的一般约定!
我怀疑这意味着比较方法不是完全排序。例如,它违反了所有排序方法必须具有的三个属性之一:
1)自反性-如果x == y,y == x .如果x
2) 恒等式:x == x。
3)瞬态性:如果x
需要固定比较方法以遵守这些定律。如何做到这一点还有待观察:)
正如其他地方指出的那样,正在排序的集合中的项(可能包括也可能不包括您自己的类,无法从堆栈跟踪中辨别)违反了比较约定。
在从 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中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。