缺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的可能性。
你需要一个别的东西,像你期望的那样工作,它不会评估你的条件,知道它总是会返回
应该在一个else
或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;
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。