当前位置: 首页 > 知识库问答 >
问题:

即使在检查null之后,比较方法也违反了它的一般约定

贺刚毅
2023-03-14

我得到以下错误

无法恢复activity { com . XXX . yyy . zzz . home activity }:Java . lang . illegalargumentexception:比较法违反了其通用契约!

即使出现此错误,我仍在处理字符串的空情况。任何关于可能出错的提示。下面的代码

public class ConversationComparer implements Comparator<Conversation> {
@Override
public int compare(Conversation x, Conversation y) {

    if (x.getLastMessageDate() == null) {
        return 1;
    }

    if (y.getLastMessageDate() == null) {
        return -1;
    }

    return y.getLastMessageDate().compareTo(x.getLastMessageDate());

}}


public java.util.Date getLastMessageDate() {
        return lastMessageDate;
    }

这就是我使用比较器的方法

if (conversationListAdapter != null) {
            Collections.sort(this.list,new ConversationComparer());
            conversationListAdapter.notifyDataSetChanged();
        }

共有2个答案

戚逸清
2023-03-14

我唯一能看到的错误是你没有正确处理x.getLastMessageDate()和y.getLastMessageDate()都是的情况。

我认为如果你在方法的开头加上这一行,它就符合合同。

if (x.getLastMessageDate() == null && y.getLastMessageDate() == null)
    return 0; 
羊舌炯
2023-03-14

您还应该再次检查 x 和 y 为 null,如果两者都为 null,则返回 0。

@Override
public int compare(Conversation x, Conversation y) {

   if (x == y || (x != null && y != null && x.getLastMessageDate() == y.getLastMessageDate()))
       return 0;    

   if (x == null)
       return 1;

   if (y == null)
       return -1;

   if (x.getLastMessageDate() == null)
       return 1;

   if (y.getLastMessageDate() == null)
       return -1;

   return y.getLastMessageDate().compareTo(x.getLastMessageDate());
}

此外,了解“getLastMessageDate()”返回什么数据类型也很有趣。

 类似资料:
  • 问题内容: 您好,以下是我的比较器的比较方法。我不确定是什么问题。我在堆栈溢出时查找了其他类似标题的问题和答案,但不确定我的方法有什么问题,但我一直在获取java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 任何帮助将不胜感激 添加我得到的异常 问题答案: 您的方法 不是可 传递的 。如果和,则必须等于。 现在考虑这种情况: 对于,和,假设方法返回以下

  • 使用自定义比较器执行< code > Collection.sort using >时,我得到一个< code > Java . lang . illegalargumentexception:Comparison方法违反了它的一般约定 我理解这是一个问题,因为该方法是不可传递的。在我的比较器中,调用了多个方法,我确定了违反此规则的代码段。然而,我无法修复它,也看不到它的问题。

  • 一切似乎都运行良好(几天),但我只遇到了一次问题,并且很难重现该问题。 “比较方法违反了其总合同!”被抛出,完全让我措手不及。我有以下几点: 我的染色体类别: 我有一个ArrayList,我使用了两个Collections。排序(MyList)和集合。排序(MyList,Collections.reverseOrder())。到目前为止,他们仍在正常工作。我在100次跑步中只遇到过一次错误。这个实

  • 嗨,下面是我的比较器的比较方法。我不知道哪里出了问题。我查了关于堆栈溢出的其他类似标题的问题和答案,但不确定我的方法有什么问题,但我不断得到java.lang.IllegalArgument异常:比较方法违反了它的一般合同! 任何帮助将不胜感激 添加我得到的异常

  • 我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别:

  • 首先,很抱歉再次就这个话题提问。我很清楚这里有很多问题和答案。我已经读了其中的一些,但我的问题是我仍然不知道我做错了什么。这是我的代码: 看来我只是瞎了眼,看不到我的错误,所以如果你们中有人能帮我解决这个问题,我将非常感谢。 编辑:我想做的是确定一条线在左上角有0/0坐标的坐标系中是上、下、最左还是最右。这些点是double类型的。下面是错误消息: