5

これは大変なことです。顧客がクラッシュ レポートを介してこのスタック トレースを送ってきました。私のアプリのクラスについては言及されていないので、どこから調べればよいのか困惑しています。

私のアプリは商用デスクトップ アプリです。クラッシュ レポートは匿名であるため、クラッシュに関する詳しい情報を簡単に入手することはできません。

編集: いくつかのグーグルとスレッドをたどると、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

4 に答える 4

3

他の場所で指摘されているように、並べ替えられているコレクション内のアイテム (独自のクラスが含まれている場合と含まれていない場合があり、スタック トレースからはわかりません) は比較規約に違反しています。

Java 6 から Java 7 への移行中に、デフォルトの並べ替えの実装がTimSortに変更されました。この影響の 1 つは、新しいソートが比較コントラクトに関してより厳密になっていることです。そのため、あなた (またはおそらく Swing) は長い間それを回避してきたかもしれませんが、もはやそうではありません。

比較コントラクトの問題を解決できない場合は、ロールバックして Java 6 スタイルの並べ替えを使用するために、プロパティを使用してアプリケーションを起動できます。

-Djava.util.Arrays.useLegacyMergeSort=true

詳細は、Java 7 リリース ノートの互換性セクションを参照してください。

于 2013-01-29T16:40:50.790 に答える
1

java.lang.IllegalArgumentException: 比較メソッドが一般規約に違反しています!

これは、比較方法が完全な順序付けではないことを意味していると思います。のように、すべての並べ替えメソッドが持つ必要がある 3 つのプロパティのいずれかに違反します。

1) 再帰性 - x == y の場合、y == x. x > y の場合、y < x。

2) アイデンティティ: x == x。

3) 透過率: x > y かつ y > z の場合、x > z。

これらの法則に従うように、比較方法を修正する必要があります。それを行う方法は、あなたがそれを見たときに見られるままになります:)

于 2013-01-22T05:35:27.027 に答える