我知道这已经有一段时间了,并且检查了我以前得到的所有答案,但是这个仍然不起作用.
对象'船员'代表有船员和其他物品的船员.比较应该通过比较'assigned_rank',一个int值,如果这两个实例中的值相等,那么'is_trainer',一个布尔值,应该有所不同.
只要它运行java <7,这种方法就很有效.但是从Java 7开始我就得到了这个:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
Run Code Online (Sandbox Code Playgroud)
这是源代码,其中一些有潜在危险的部分已经被评论过,但它仍然不起作用:
public class crew implements Serializable, Comparable<crew> {
private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...
@Override
public int compareTo(crew him) {
int myRank = this.getAssigned_rank();
int hisRank = him.assigned_rank;
if (this == him) {
return 0; …Run Code Online (Sandbox Code Playgroud) 如何在Grails Spock测试中实现Groovy的新特性?每次尝试时,我都会得到一个看起来像这样的堆栈跟踪.我可能不知道Groovy路径有一些限制吗?
JDK版本:
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
Run Code Online (Sandbox Code Playgroud)
Groovy Verison:
Groovy Version: 2.3.6 JVM: 1.7.0_65 Vendor: Oracle Corporation OS: Linux
Run Code Online (Sandbox Code Playgroud)
Grails版本:
Grails version: 2.4.3
Run Code Online (Sandbox Code Playgroud)
简化代码:
import grails.test.mixin.Mock
@Mock([AnalyticFilters])
trait ControllerTestBase {
public void setupCommonStuff(boolean setupIdCall = false) {
params.devId = TEST_DEV_ID
// mocking version filter
params.version = "v${TEST_VERSION}"
defineBeans{
CacheService(cacheServiceMock: "createMock")
}
CommonParams.parseParams(params)
cacheMock = applicationContext.getBean("cacheServiceMock")
if(setupStoreIdCall) {
cacheMock.demandExplicit.makeCompositeKey(0..20) { List<String> list ->
def (String uuid, String orgUuid) …Run Code Online (Sandbox Code Playgroud) 我在standalone-full.xml中添加了system-properties标记,但它不能在独立模式下工作.但是,如果我在domain.xml中添加相同的标记,则它适用于域模式.
<?xml version='1.0' encoding='UTF-8'?>
<server xmlns="urn:jboss:domain:2.2">
<extensions>
....
</extensions>
<system-properties>
<property name="java.util.Arrays.useLegacyMergeSort" value="true"/>
</system-properties>
</server>
Run Code Online (Sandbox Code Playgroud)
可以在domain.xml,host.xml和standalone.xml中的多个位置设置系统属性值.
那么standalone-full.xml呢?
我不想通过命令行设置它,甚至不在java代码中.
这是困难的一个.客户通过崩溃报告向我发送了此堆栈跟踪信息.它没有提到我的应用程序的类,所以我很困惑,从哪里开始寻找.
我的应用是商业桌面应用.崩溃报告是匿名的,因此我无法轻易获得有关崩溃的更多信息.
编辑:一些谷歌搜索和线程跟踪使我得出结论,它是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) …Run Code Online (Sandbox Code Playgroud) 此问题与“比较方法违反其一般合同!”有关。-TimSort和GridLayout 以及其他一些类似的“违反通用合同”问题。我的问题特别与Ceekay在页面底部有关“如何测试TimSort实现的答案”有关。就我而言,我已修复了由于对称性违规而导致我出现此问题的应用程序错误,但是我无法创建一个单元测试来暴露该违规(如果将来对修补程序进行注释或未修正)。
public class TickNumber implements Comparable<TickNumber> {
protected String zone;
protected String track;
}
public class GisTickNumber extends TickNumber implements Comparable<TickNumber> {
private String suffix;
}
Run Code Online (Sandbox Code Playgroud)
我省略了所有实现细节,但是基本上,刻度号是4位数字,其中前两位是区域,后两位是磁道。GisTickNumbers在“区域”或“跟踪”字段中可以包含字母字符,并且可以选择包含一个或两个字符的字母后缀。有效刻度是该范围内的所有整数[0000, 9999](即使表示为字符串)。所有有效的刻度线编号都是有效的Gis刻度线编号,但有效的Gis刻度线也可能类似于A912, R123, 0123G, A346*。
我的对称性违反是在GisTick中compareTo,我考虑了可能的后缀,但在普通Tick中,compareTo我没有考虑它。因此,如果“ this”是一个0000Tick,而“ that”是一个0000*Gis Tick,0000.compareTo(0000*)则将返回0。而如果“ this”是一个0000*Gis Tick,并且“ that”是一个0000Tick,0000*.compareTo(0000)则将返回1。护罩拉回)
根据Ceekay在对链接问题的回答中,
- 创建包含32个或更多对象的列表。
- 在该列表中,需要[是]两个或多个运行。
- 每次运行必须包含3个或更多对象。
满足这三个条件后,就可以开始测试此失败了。
我相信我已经为单元测试设置了这样的TickNumber(和GisTickNumber)对象列表,但我似乎无法使测试失败。即使列表中有100个以上的对象,也有两个以上的运行,每个运行包含约10个对象。因此,我的问题是,Collections.sort(testList)由于“一般(对称)合同违约”而导致调用失败,被测对象列表还需要满足哪些其他特征?
首先,我知道许多其他线程都描述了这个问题.但是我无法找到并回答这个问题,为什么不总是抛出这个错误?
让我来描述一下我的意思.我写了一些示例代码来说明这一点:
public class Mushroom {
public int size;
public Mushroom(int size) {
this.size = size;
}
@Override
public boolean equals(Object obj) {
//this is intentionally false - read in description
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
DSA
public class MushroomComparator implements Comparator<Mushroom> {
@Override
public int compare(Mushroom o1, Mushroom o2) {
// here is the code which breaks the contract
if (o1.size < o2.size){
return 1;
}else if(o1.size >o2.size){
return -1;
}
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
最后测试比较:
public class ComparisonTest { …Run Code Online (Sandbox Code Playgroud)