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

比较方法违反了其一般合同异常java 7

农鸿德
2023-03-14

下面的代码在Java 6上运行时抛出“Java比较方法违反了它的通用契约”。但是,在Java 7上,它不会抛出同样的异常。有什么问题?。如何修改这段代码以在Java 7上抛出异常?。

class ComparableScore implements Comparable<ComparableScore> {

    private int score;
    private String itemName;

    int getScore() {
        return score;
    }

    void setScore(int i) {
        score = i;
    }

    String getItemName() {
        return itemName;
    }

    void setItemName(String str) {
        itemName = str;
    }

    public int compareTo(ComparableScore another) {
        if (score == another.getScore())
            return this.getItemName()
                    .compareToIgnoreCase(another.getItemName());
        else if ((score) > another.getScore())
            return 1;
        else
            return -1;
    }

    @Override
    public boolean equals(Object o) {
        final ComparableScore other = (ComparableScore) o;

        if (score == other.getScore()
                && this.getItemName().equalsIgnoreCase(other.getItemName()))
            return true;
        else
            return false;
    }
}

共有1个答案

劳昊明
2023-03-14

这与这个Java“bug”——http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7193557有关

除了它不是一个bug,它是一个特性。sort的新Java实现告诉您,您的compareTo方法已损坏。

然而,错误报告说异常是在Java7而不是Java6引发的。检查Java6源代码证实了这一点。该消息没有出现在Arrays.sort的源代码中,这是在Java6中实现排序代码的地方。

如果您的目标是以Java 7中出现异常的方式破坏代码,那么:

>

  • 目前没有抛出异常,因为合同没有被破坏。(或者至少,不是以我能看到的任何明显方式…)

    我不知道触发异常的确切条件。

    尝试一些实验(即使用compareTo等于的不同实现,这些实现以不同的方式破坏了契约),或者阅读Java7源代码,自己找出是什么导致了它……可重复性。

    (为什么,为什么,为什么你要这么做???)

  •  类似资料:
    • 我看到我的应用程序在一些中国 Android 手机上发生了很多崩溃,并出现错误:比较方法违反了其总合同! 我读过这与Collections.sort有关。 我不太确定的是,这是否是因为我的自定义比较器。 以下是错误发生的地方: 比较器是这样的: 所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用 感谢任何帮助

    • 对不起,又是一个问题,但我根本不明白这里发生了什么,或者我哪里出错了。 概述:我有一个包含多个-对象。它们有一个和一个。我想按以下条件对它们进行排序,优先级如下所列: 但是当这样做时,我得到以下错误: 我得到的:我在JavaFX项目中也有同样的事情发生,但是在那里我使用而不是。我需要转换为,因为显然Android还不支持方法。 这是启动排序和定义< code>Comperator的方法: 如您所见

    • 我在尝试对节点的数组列表进行排序时遇到了这个错误。我尝试了大多数解决方案,但没有一个在我的案例中有效。 此代码为 它适用于小输入,但是当输入数量很大时,它会给出这个错误。我也读过比较方法中的传递性规则,但我不知道它是如何在这种情况下应用的。 先谢谢你。

    • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

    • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误:

    • 问题内容: 我收到以下错误:“比较方法违反了它的一般约定!” 当使用以下比较器时,但是我无法使用jUnit复制异常。我想知道是什么引起了这个问题以及如何复制它。有一些其他例子也有相同的问题,但没有类似的例子。 通过使用以下代码调用该代码: `` Collections.sort(dtos, new DtoComparator()); ``` 谢谢你的帮助。 额外信息:该错误似乎发生在Java ut