0

下面的代码在 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;
    }
}
4

1 回答 1

1

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

除了它不是一个错误,它是一个功能。的新 Java 实现sort告诉您您的compareTo方法已损坏。

但是,错误报告说异常是在 Java 7 而不是 Java 6 上引发的。检查 Java 6 源代码可以确认这一点。该消息不会出现在Arrays.sortJava 6 中实现排序代码的源代码中。


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

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

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

  • 尝试一些实验(即使用不同的实现compareToequals以不同的方式破坏合同)或阅读 Java 7 源代码,以自己找出导致它的原因......可重现。

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

于 2013-04-09T09:19:57.987 回答