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