繁体   English   中英

Java:IllegalArgumentException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM