Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalArgumentException:比较方法违反了其一般约定[dup]_Java_Sorting_Date_Comparator - Fatal编程技术网

java.lang.IllegalArgumentException:比较方法违反了其一般约定[dup]

java.lang.IllegalArgumentException:比较方法违反了其一般约定[dup],java,sorting,date,comparator,Java,Sorting,Date,Comparator,在尝试了3个小时后,我发现所有的解决方案都没有成功,我将我的问题发布在这里。我得到一个例外: java.lang.IllegalArgumentException:比较方法违反了其一般约定 这是我的代码: public int compare(InstrumentModel o1, InstrumentModel o2) { int c = 0; if(c == 0 && o1.getUnderlyingAsset()!=null) { c = o

在尝试了3个小时后,我发现所有的解决方案都没有成功,我将我的问题发布在这里。我得到一个例外:

java.lang.IllegalArgumentException:比较方法违反了其一般约定

这是我的代码:

public int compare(InstrumentModel o1, InstrumentModel o2) {
    int c = 0;
    if(c == 0 && o1.getUnderlyingAsset()!=null) {
        c = o1.getUnderlyingAsset().compareTo(o2.getUnderlyingAsset());
    }
    if(c == 0 && o1.getSymbol()!=null) {
        c = o1.getSymbol().compareTo(o2.getSymbol());
    }
    if(c == 0 && o1.getExpiryDateInDate()!=null && o2.getExpiryDateInDate()!=null) {
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
        Date date1 = null;
        Date date2 = null;
        try {
            date1 = df.parse(df.format(o1.getExpiryDateInDate()));
            date2 = df.parse(df.format(o2.getExpiryDateInDate()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c = date1.before(date2) ? 1 : date1.after(date2) ? -1 : 0 ;
    }
    return c;
}

您对空值的处理不好

如果比较的
仪器模型
s中的一个具有
null
getExpiryDateInDate
且另一个具有非null值,则不应返回0

你应该始终如一。例如:

  • 如果两者都为null,则返回0
  • 如果
    o1.getExpiryDateInDate()=null
    &&o2.getExpiryDateInDate()==null,返回
    1
  • 如果
    o1.getExpiryDateInDate()==null
    &&
    o2.getExpiryDateInDate()=null
    ,返回-1
  • 最后,只有当两者都不是
    null
    时,才运行日期比较代码以确定返回的内容

注意:您对资产和符号属性的
null
处理看起来也不太好,但可能它们从来都不是
null
(或者至少如果其中一个有值,另一个也有值)。否则,如果
o2.getUnderlyingAsset()
null
(取决于
getUnderlyingAsset()
的类型以及它实现
compareTo
的方式),则诸如
o1.getUnderlyingAsset().compareTo(o2.getUnderlyingAsset())
之类的比较可能会导致问题.

哪一行引发异常?@vincrichaud行号未在异常中打印。此方法位于自定义比较器类中。堆栈跟踪告诉集合的行号。仅排序(列表,new ExpiryComparator())。根据UnderlineAsset排序,然后是symbol,最后是ExpireyDateIndate属性。如果我在此处删除expirydateindate,则记录将按预期方式排序。@Berger您能帮助我理解文章中的行吗:满足compareParents()中传递性要求的一种方法是遍历getParent()吗链而不是只查看直接祖先。@mayukhg它意味着还要测试
getParent().getParent()
getParent().getParent().getParent()
等等,直到没有更多的父级。那么你就涵盖了所有情况,不能违反合同下面的建议通过检查空值为我工作。谢谢!!这个建议有效。我按照您的建议检查了expirydateindate字段的空值。如果这是问题所在,为什么询问者没有看到任何
NullPointerException
?@OleV.V<代码>如果(c==0&&o1.getExpiryDateInDate()!=null&&o2.getExpiryDateInDate()!=null)。根据OP的评论,只有一个问题与有效期的比较有关。没有NPE的风险。谢谢,这就解释了。显然,我第一次没有仔细阅读代码。您可以利用(或
nullsLast
)。