缺lessif / else语句的返回语句

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

为什么这给我一个缺less返回声明错误? 每个if / else都有一个返回错误出现在最后一个括号中

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

我build议:

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

在我看来,这个解决scheme解决了编译器问题,并且提高了可读性。


或者,有这个解决scheme:

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

抛出一个exception将允许你摆脱这个方法,而不会返回任何东西…因为可以说,如果你到了最后的else ,那么显然是出了问题。

else if else你可以尝试改变else

 if (number == randomnumber) return 0; else if (number < randomnumber) return -1; else return 1; 

编译器不需要能够确定你的if / else树是否覆盖了每一个可能的情况。 如果你可以编写代码,一些编译器足够聪明,搞清楚是否合适,而其他编译器则不行。 Java并没有精确地规定编译器的精确程度,而是要求你编写清晰,干净的代码。

函数的closures大括号是由Java规范中的定义可达的。 你可以certificate它是无法通过其他一些“可达”的定义是无关紧要的。 “可达”的Java规范概念是编译器实际可以实现的规范中详细解释的forms概念。 这不是“可达”的常识概念,哪一个永远不会教给计算机。

基本上,编译器不够聪明,以realzie number == randomnumber || number < randomnumber || number > randomnumber randomnumber number == randomnumber || number < randomnumber || number > randomnumber number == randomnumber || number < randomnumber || number > randomnumber number == randomnumber || number < randomnumber || number > randomnumber是一个重言式。 既然你没有else ,它认为有可能你会越过条件,然后打到函数的结尾而不返回。 最简单的解决方法是将您的最后一个elseif改为else 。 你从前面的条件知道,如果你达到那个点,那么number > randomnumber必须是真的。 (你可以添加一个断言,如果你是偏执狂,并想确定。)

return语句后没有else需要:

 if (number == randomnumber) return 0; if (number < randomnumber) return -1; // Must be true: if (number > randomnumber) return 1; 

请注意,解决此问题的原因是因为编译器不检查逻辑上必须返回的解决scheme。 例如,当A必须> <或= B时,它不检查该关系。 它正在寻找明确涵盖每条path的可能性。

你需要一个别的东西,像你期望的那样工作,它不会评估你的条件,知道它总是会返回

应该在一个elseelse之外进行返回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; 

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。