“线程中的异常”;AWT-EventQueue-0“;java.lang.IllegalArgumentException:比较方法违反了其一般约定

“线程中的异常”;AWT-EventQueue-0“;java.lang.IllegalArgumentException:比较方法违反了其一般约定,java,multithreading,swing,comparison,equals,Java,Multithreading,Swing,Comparison,Equals,免责声明:我看到了关于比较函数传递性的线程,但我不认为我的线程不好/我不认为它们有错误 所以我写了一个兔子和狼的模拟——一开始有一定数量的狼和兔子,兔子逃离狼,狼追逐兔子,当它们在同一个街区相遇时,兔子被杀死,模拟在没有兔子的情况下结束 对于小型电路板,直到大约32x32都是正常的,但是对于64+我在运行时遇到以下错误 此外,以下是我的3个比较函数: lblock是jlabel,hare/wolf/killer是图标 public synchronized boolean isEmpty(in

免责声明:我看到了关于比较函数传递性的线程,但我不认为我的线程不好/我不认为它们有错误

所以我写了一个兔子和狼的模拟——一开始有一定数量的狼和兔子,兔子逃离狼,狼追逐兔子,当它们在同一个街区相遇时,兔子被杀死,模拟在没有兔子的情况下结束

对于小型电路板,直到大约32x32都是正常的,但是对于64+我在运行时遇到以下错误

此外,以下是我的3个比较函数:

lblock是jlabel,hare/wolf/killer是图标

public  synchronized boolean isEmpty(int x, int y){
    if(!(lBlocks[x][y].getIcon() instanceof Icon)) return true;
    return false;
}


public  synchronized boolean isWolf(int x, int y){
    if(!(lBlocks[x][y].getIcon() instanceof Icon)) return false;
    if(lBlocks[x][y].getIcon().equals(hare)||lBlocks[x][y].getText().equals("h")||isEmpty(x,y)) return false;
    return true;
}

public  synchronized boolean isHare(int x, int y){
    if(!(lBlocks[x][y].getIcon() instanceof Icon)) return false;
    if(isEmpty(x,y)||isWolf(x,y)) return false;
    return true;
}

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeLo(TimSort.java:747)
    at java.util.TimSort.mergeAt(TimSort.java:483)
    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.SortingFocusTraversalPolicy.getDefaultComponent(SortingFocusTraversalPolicy.java:515)
    at javax.swing.SortingFocusTraversalPolicy.getComponentDownCycle(SortingFocusTraversalPolicy.java:204)
    at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(SortingFocusTraversalPolicy.java:447)
    at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(LayoutFocusTraversalPolicy.java:166)
    at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(SortingFocusTraversalPolicy.java:515)
    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:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    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:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.SequencedEvent.dispatch(SequencedEvent.java:128)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    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:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    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)
问题是,它没有做任何事情-代码正在工作,模拟正在进行,但我想修复它。最糟糕的事实是,没有出现错误的行,我有很多.equals(代码总共约400行)-我不知道在哪里可以找到我的错误:(


编辑:我发现如果电路板的x和y都大于57,则会出现此问题,如果它们较小(或至少其中一个较小),则不会出现此问题,哈哈。

快速解决方案似乎是:
System.setProperty(“java.util.Arrays.useLegacyMergeSort”,“true”);

根据。

哪一行是
TimSort.java:747
?还有,是时候重构那个大类了吗?TimSort.java:747不是我写的东西,它是一个库或什么的,但我没有使用任何排序。我刚刚写了这个程序,我想说它写得很好。我有5个类:90行,63行,152行,79行和80行。听起来像timsort是最有效的排序算法之一,它试图使用
Comparable
接口,这要求您实现
compareTo(other)
,以便
返回-1,等于0,而
返回1。我不太明白您刚才说的是什么:(我从来没有使用过比较方法,也没有对任何东西进行排序,为什么要实现比较方法?据我所知,这个错误是java 7默认使用新的排序方法的结果。解决方案是使用JRE 6,或者更新所有库(到最新版本)因此,它们与java 7兼容。如果两者都不起作用,请发布更多代码。这并不完全“起作用”,因为比较代码在某些地方仍然存在问题。它确实起作用,因为它使java对这些错误更加宽容。如果您的代码以某种方式随机决定
1<1==true
,请不要感到惊讶,或者
10<1&&1<10==true
好吧,那么我想它只需要使用库,我一学会如何在linux上使用库就会更新它,因为我的代码中不喜欢数字比较。是的,这是一个相当严重的问题。谢天谢地,它不会影响数字比较。它会影响像
cardQueen.compareTo这样的代码(cardOne)
,使理论上的纸牌游戏相信女王的身价低于1。