我试图告诉Critter程序从四个选项中随机选择攻击类型;我以为我的返回语句基础已被覆盖,但我从drjava那里得到了“遗漏的返回语句”错误:
public Attack fight(String opponent) {
int fightChoice = new Random().nextInt(4);
if(fightChoice == 0){
return Attack.ROAR;
} if(fightChoice == 1){
return Attack.POUNCE;
} if(fightChoice == 2){
return Attack.SCRATCH;
} if(fightChoice == 3){
return Attack.FORFEIT;
}
}
任何想法为什么会这样?
答案 0 :(得分:3)
基本上,编译器不够聪明,无法确定您已经用四个if
语句覆盖了所有可能性(它并不真正了解Random.nextInt()
返回值的合同)。
因此,您需要在最终return
之后添加一个虚拟if
。你返回那里并不重要,因为它实际上是死代码。但是,返回某种未使用或明显无效的值将是一种很好的方式。
编辑:在第二个想法,而不是返回虚拟值,最好无条件地抛出某种“程序员错误”异常。
答案 1 :(得分:1)
在if语句之外需要一个缺少的语句。例如,如果flightChoice == 4
,if
条件都不成立,那么您应该在方法的末尾添加return
。此返回语句必须返回类似Attack
分支的if
类型的内容。
答案 2 :(得分:1)
您可能认为 if语句涵盖了所有可能的情况,但编译器只是编译代码,不包括/计算可能性。您需要在最后一个 if-statement 之后添加return
语句。
答案 3 :(得分:1)
试想一下,当if condition
都不是true
时会发生什么?在这种情况下,您不会从该方法返回任何内容。
您应该从您的方法可以遵循的每个路径返回,否则您将收到missing return
语句错误。
if's
if-else if
阻止,然后添加
最后是else
,并从那里返回一些值。答案 4 :(得分:0)
如果没有return
语句为真,则需要if
语句。
答案 5 :(得分:0)
上述/之前的答案解释说,如果没有return
为真,则最后需要if
语句。在这种情况下,我只想添加一个建议,作为一种好的做法(可能不是最好的):只在结尾处返回一个结果,并为每个if
中的返回结果分配一个值(也许添加一些{ {1}}在这种情况下使其更有效率。)