2013-03-08 38 views
5

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

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; 
    } 
} 

回答

1

你这个分支后失踪的还有:

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

如果测试失败(compareTo不返回0)的方法将有没有返回值退出,这在Java中是非法的。

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

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))),但您的实现不是。

+0

@TedHopp Right(thanks,fixed)。我还纠正了反对称只是结果的**符号**(都是零,或者一个是正的,另一个是负的)。绝对值并不重要。 – Javier 2013-03-08 06:51:10

1

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

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

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; 
    }  

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

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" 
    } 
相关问题