[英]Java: IllegalArgumentException
我正在查看一些旧代码,并且发现了导致我得到“比较方法违反其一般合同!”错误的部分。 我知道此错误是代码无法传递的结果,但我不完全了解如何正确修复它。
这是导致错误的代码。
private void sortHistories(List<History> histories) {
Collections.sort(histories, new Comparator<History>() {
@Override
public int compare(History o1, History o2) {
return o1 == o2 ? 0
: o1 == null ? -1
: o2 == null ? 1
: o1.getFamilyMembers().equals(o2.getFamilyMembers()) ? 0 //getFamilyMembers() returns a string
: o1.getFamilyMembers() == null ? -1
: o2.getFamilyMembers() == null ? 1
: o2.getFamilyMembers().compareTo(o2.getFamilyMembers()) != 0 ?
o2.getFamilyMembers().compareTo(o2.getFamilyMembers())
: o1.getDisease().equals(o2.getDisease()) ? 0 //getDisease() also returns a string
: o1.getDisease() == null ? -1
: o2.getDisease() == null ? 1
: o1.getDisease().compareTo(o2.getDisease());
}
});
}
最初,在比较字符串getDisease()
和getFamilyMembers()
时,代码使用==
而不是equals()
getFamilyMembers()
。 我认为将==
更改为equals()
可以解决问题,但事实并非如此。
多亏了HaifengZhang和YoungHobbit,解决方案是:
public int compare(History o1, History o2) {
return o1 == o2 ? 0
: o1 == null ? -1
: o2 == null ? 1
: o1.getFamilyMembers() == null ? -1
: o2.getFamilyMembers() == null ? 1
: o1.getFamilyMembers() == o2.getFamilyMembers() ? 0
: o2.getFamilyMembers().compareTo(o1.getFamilyMembers()) != 0 ?
o2.getFamilyMembers().compareTo(o1.getFamilyMembers())
: o1.getDisease() == null ? -1
: o2.getDisease() == null ? 1
: o1.getDisease() == o2.getDisease() ? 0
: o1.getDisease().compareTo(o2.getDisease());
}
请仔细阅读文档。抛出此异常是Java7的一项新功能。
此处有更多详细信息:: https://stackoverflow.com/a/8327575/3080158
可以使用新的系统属性配置旧行为:java.util.Arrays.useLegacyMergeSort。
http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.