5

我现在正在学习基本的 Java,并且我的代码有一个我无法弄清楚的问题。基本上就是标题所说的。我的 Java 编译器告诉我,我的自定义 compareTo 方法有一个错误,说它需要返回一个 int。问题是,据我所知,它正在返回一个 int。然而它仍然给我一个错误。有人可以在我的代码中指出什么问题吗?而且我已经在课堂上实现了 Comparable 。这是我的方法:

public int compareTo(Homework other) {
    if (getDaysLate() < other.getDaysLate()) {
        return -1;
    } else if ((dateSubmitted == other.dateSubmitted)
            && (files.compareTo(other.files) == -1)) {
        return -1;
    } else if ((dateSubmitted == other.dateSubmitted)
            && (files == other.files)) {
        if (name.compareTo(other.name) == -1) {
            return -1;
        } else if (name.compareTo(other.name) == 1) {
            return 1;
        } else if (name.compareTo(other.name) == 0) {
            return 0;
        }
    } else {
        return 0;
    }
}
4

5 回答 5

2

第三个中有一条路径else不返回任何内容。

 else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {
    if (name.compareTo(other.name) == -1) {
      return -1;
    }
    else if (name.compareTo(other.name) == 1) {
      return 1;
    }
    else if (name.compareTo(other.name) == 0) {
      return 0;
    } else return ...
}

顺便说一句,我不确定我是否遵循您的实现逻辑,因为您似乎返回 0 if dateSubmitted != other.dateSubmittedcompareTo也应该是反对称的(即sgn(x.compareTo(y)) == -sgn(y.compareTo(x))),但你的实现不是。

于 2013-03-08T06:41:26.923 回答
1

您在此分支之后缺少 else :

else if (name.compareTo(other.name) == 0) {
    return 0;
}

如果测试失败(compareTo不返回 0),则该方法必须在没有返回值的情况下退出,这在 Java 中是非法的。

此外,compareTo可以返回任何整数值,不仅是 0、1 和 -1。

于 2013-03-08T06:41:17.580 回答
1

你怎么能确定(所有这些 if 和 else)你总是返回一个 int?这对我来说似乎并不那么明显,显然编译器也同意我的看法。

解决此问题的一种方法(可能不是最好的方法)是return -1; //or whatever value在函数末尾添加 a 。

于 2013-03-08T06:43:21.813 回答
1

在您的第二个 else-if 语句中,您有一个可能不会返回任何内容的代码路径。你说:

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {  
    if (name.compareTo(other.name) == -1) {  
        return -1;  
    }  
    else if (name.compareTo(other.name) == 1) {  
        return 1;  
    }  
    else if (name.compareTo(other.name) == 0) {  
       return 0;  
    }    

,但是如果其他的如果没有一个是真的呢?尝试将第二个 else-if 语句中的最后一个 else-if 更改为 else。

于 2013-03-08T06:44:05.933 回答
0

该方法应在所有代码流路径上返回适当的值;换句话说,在方法返回的所有条件下。在下面的if块中,它不会在我标记的一条路径上返回。

   else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {
        if (name.compareTo(other.name) == -1) {
        return -1;
        }
        else if (name.compareTo(other.name) == 1) {
        return 1;
        }
        else if (name.compareTo(other.name) == 0) {
        return 0;
        }
        // It should return something here, if none of the above "if" statements match.
        // Or one of the above "else if" should be changed to "else"
    }
于 2013-03-08T06:44:07.957 回答