Java修改过的compareTo方法说它需要返回一个int,但它应该返回一个

时间:2013-03-08 06:38:43

标签: java compareto

我现在正在学习基础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;
    }
}

5 个答案:

答案 0 :(得分: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 ...
}
顺便说一句,我不确定我是否遵循了你的实现逻辑,因为如果dateSubmitted != other.dateSubmitted你似乎正在返回0。 compareTo也应该是反对称的(即sgn(x.compareTo(y)) == -sgn(y.compareTo(x))),但您的实现不是。

答案 1 :(得分:1)

在这个分支之后你错过了其他人:

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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。

答案 4 :(得分: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"
    }