缺少if / else语句的return语句

时间:2013-11-27 01:36:58

标签: java

public int checkGuess(int g, int randomnumber){

    number=g;
    this.randomnumber= randomnumber;

    if (number == randomnumber)
        return 0;

    else if (number < randomnumber)
        return -1;

    else if (number > randomnumber)
        return 1;

}

为什么这会给我一个丢失的return语句错误?每个if / else都有回报 错误出现在最后一个括号

8 个答案:

答案 0 :(得分:8)

每个return语句都在if语句中。虽然在编写逻辑上可能是不可能的,但是当if都没有评估为真时,编译器需要返回。

我建议:

public int checkGuess(int number, int randomnumber){
    int retVal = 0;
    this.randomnumber= randomnumber;

    if (number == randomnumber) {
        retVal = 0;
    } else if (number < randomnumber) {
        retVal = -1;
    } else if (number > randomnumber) {
        retVal = 1;
    }
    return retVal;
}

在我看来,这个解决方案可以解决编译器问题并略微提高可读性。


或者,有这个解决方案:

public int checkGuess(int number, int randomnumber){
    this.randomnumber= randomnumber;

    if (number == randomnumber) {
        return 0;
    } else if (number < randomnumber) {
        return -1;
    } else if (number > randomnumber) {
        return 1;
    } else {
        //throw an exception
    }
}    

抛出一个异常将允许你退出方法而不返回任何东西......因为可以说,如果你到达最后的else,显然出现了问题。

答案 1 :(得分:3)

您可以尝试将las else if更改为else

if (number == randomnumber)
    return 0;

else if (number < randomnumber)
    return -1;

else
    return 1;

答案 2 :(得分:2)

编译器不需要能够确定您的if / else树是否涵盖了所有可能的情况。如果你能编写一些代码,那些编译器很聪明,可以搞清楚并且其他编译器没有,那就太糟糕了。 Java要求您编写清晰,干净的代码,而不是精确地确定编译器的精确程度。

根据Java规范中的定义,函数的结束大括号是可达的。您可以证明某些其他“可达”定义无法访问它并不重要。 Java规范的“可达”概念是规范中详细解释的正式概念,编译器可以实际实现。它不是“可达”的常识概念,无论如何都无法教给计算机。

答案 3 :(得分:2)

基本上,编译器不够智能,以至于number == randomnumber || number < randomnumber || number > randomnumber是重言式。由于你没有else,它认为你可能会超过条件,然后在没有返回的情况下点击函数的结尾。最简单的解决方法是将您的上一个elseif更改为else。您从以前的条件中了解到number > randomnumber如果达到这一点必须是真的。 (如果你是偏执狂,你可以添加一个断言,并且想要确定。)

答案 4 :(得分:1)

else声明之后无需return

if (number == randomnumber)
  return 0;

if (number < randomnumber)
  return -1;

// Must be true: if (number > randomnumber)
return 1;

请注意,解决此问题的原因是编译器不检查逻辑上必须返回的解决方案。例如而A必须> &LT;或=到B,它不检查该关系。它正在寻找明确涵盖每条路径的可能性。

答案 5 :(得分:0)

你需要一个其他的工作,如你所料,它不会评估你的条件,知道它将永远返回

答案 6 :(得分:0)

应在else内或整个if/else-if内进行返回。根据条件

,所有退货都不可能返回
if (condition 1)
    return a;
else if (condition 2)
    return b;
else if (condition 3)
    return c;

如果不满足条件1,2或3,则不会返回。应始终提供退货。所以修复就是:

if (condition 1)
    return a;
else if (condition 2)
    return b;
else if (condition 3)
    return c;
else
    return d;

或者

if (condition 1)
    return a;
else if (condition 2)
    return b;
else if (condition 3)
    return c

return d;

答案 7 :(得分:0)

Java要求保证非void方法返回一些东西(即使它是null)。如果有if语句,根据定义,有时只运行return语句。

if(number == randomnumber) {
    return 0;
} else if(number < randomnumber) {
    return -1;
} else if(number > randomnumber) {
    return 1;
} else {
    return -2;
}

else语句不是必需的,但它确实更容易理解imo。