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

时间:2018-06-19 09:19:25

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

1 个答案:

答案 0 :(得分:3)

您对空值的处理不当。

如果其中一个比较的InstrumentModel具有null getExpiryDateInDate而另一个具有非空值,则不应返回0.

你应该保持一致。例如:

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

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