Java:IllegalArgumentException

时间:2016-12-26 04:59:13

标签: 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());
            }
        });
    }

最初,在比较字符串==equals()时,代码使用getDisease()而不是getFamilyMembers()。我认为从==更改为equals()可以解决问题,但事实并非如此。

2 个答案:

答案 0 :(得分:2)

感谢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());
            }

答案 1 :(得分:0)

仔细阅读文档。抛出此异常是一项新的Java7功能。

此处更多详情:: https://stackoverflow.com/a/8327575/3080158

可以使用新的系统属性配置旧行为:java.util.Arrays.useLegacyMergeSort。

http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source

enter image description here

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

enter image description here