这是我的compareTo方法,但我仍然得到“缺少返回语句”警告。 谁能告诉我我的代码有什么问题?
public int compareTo(Flows other) {
if(this.srcAddr.equals(other.srcAddr)){
if(this.dstAddr.equals(other.dstAddr)){
if(this.srcPort.equals(other.srcPort)){
if(this.dstPort.equals(other.dstPort)){
if(this.protocol.equals(other.protocol)){
return 0;
}
}
}
}
}
}
答案 0 :(得分:5)
两件事:
您将获得“缺少返回语句”,因为存在未返回任何值的执行路径。例如,当第一个if语句计算为false时。
您违反了compareTo()合约。对于以下调用:a.compareTo(b),结果应:如果a等于b,则为0;如果a小于b,则为< 0;如果a大于b,则为> 0 。看来你正在使用compareTo()检查是否相等,在这种情况下,正确的方法是覆盖equals()方法。
答案 1 :(得分:2)
这看起来像一个等于方法。如果意图只是比较两者是否相同,我会做类似
的事情return srcAddr.equals(other.srcAddr) &&
dstAddr.equals(other.dstAddr) &&
srcPort.equals(other.srcPort) &&
dstPort.equals(other.dstPort) &&
protocol.equals(other.protocol);
如果不意图,您可能违反了compareTo的合同,因为您的方法似乎不符合传递要求。来自Comparable
的文档:
实现者还必须确保关系是可传递的
答案 2 :(得分:1)
这是因为在您的代码中,compareTo有可能不返回任何内容!想想如果所有这些if语句都失败了,那么它将触及方法的结尾并且没有返回任何内容。你需要进一步回归:
public int compareTo(Flows other) {
if(this.srcAddr.equals(other.srcAddr)){
if(this.dstAddr.equals(other.dstAddr)){
if(this.srcPort.equals(other.srcPort)){
if(this.dstPort.equals(other.dstPort)){
if(this.protocol.equals(other.protocol)){
return 0;
}
}
}
}
}
return 1;
}
此外,您还没有进行完整的比较。如果它们相等则需要返回0,如果差值小于0则需要返回0,如果差值大于0则需要返回0。它看起来你最好等于压倒平等!
可能是这样的:
public boolean equals(Flows other) {
return (this.srcAddr.equals(other.srcAddr) && this.dstAddr.equals(other.dstAddr) && this.srcPort.equals(other.srcPort) && this.dstPort.equals(other.dstPort) && this.protocol.equals(other.protocol));
答案 3 :(得分:0)
只需在函数末尾添加“返回1”(或任何内容),它就可以解决问题。
答案 4 :(得分:0)
这将编译并运行,但合同的其余部分呢?哪里小于和大于?
public int compareTo(Flows other) {
int value = 0;
if(this.srcAddr.equals(other.srcAddr)){
if(this.dstAddr.equals(other.dstAddr)){
if(this.srcPort.equals(other.srcPort)){
if(this.dstPort.equals(other.dstPort)){
if(this.protocol.equals(other.protocol)){
value = 0;
}
}
}
}
return value;
}