这很奇怪。我的编译器说我错过了一个return语句,但我已经有3个。 这是我的代码:
public int tortoiseMoves()
{
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
}
if (i >= 6 && i <= 8)
{
int slowplod = 1;
return slowplod;
}
if (i >= 9 && i <= 10)
{
int slip = -6;
return slip;
}
}
答案 0 :(得分:8)
您必须确保返回始终值。如果你的所有条件都失败了,你就不会退货。
修复方法是将if
语句链接起来,因为它们是独占的,并使用else
来捕获所有其他情况。
public int tortoiseMoves() {
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
}
else if (i >= 6 && i <= 8)
{
int slowplod = 1;
return slowplod;
}
else if (i >= 9 && i <= 10)
{
int slip = -6;
return slip;
}
else {
// return something or throw exception
return 0;
}
}
答案 1 :(得分:7)
必须至少有一个肯定会达到的返回语句,但代码中没有这样的语句
答案 2 :(得分:4)
您需要为代码中的每个可能情况添加一个return语句。可能是所有ifs
计算到false
并因此不执行return
语句的情况。试试这个:
public int tortoiseMoves()
{
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
}
if (i >= 6 && i <= 8)
{
int slowplod = 1;
return slowplod;
}
if (i >= 9 && i <= 10)
{
int slip = -6;
return slip;
}
return Something to return if none of the ifs is true
}
虽然您可以将代码更改为:
public int tortoiseMoves()
{
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
} else if (i >= 6 && i <= 8){
int slowplod = 1;
return slowplod;
} else if (i >= 9 && i <= 10) {
int slip = -6;
return slip;
} else {
return Something if none of the ifs is true
}
}
答案 3 :(得分:3)
一般来说,有两种方法可以避免这个问题:
默认回报:
public int tortoiseMoves()
{
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
}
if (i >= 6 && i <= 8)
{
int slowplod = 1;
return slowplod;
}
if (i >= 9 && i <= 10)
{
int slip = -6;
return slip;
}
//If code reaches here, you know none of the other returns were called
return someDefaultValue;
// OR
// throw new Exception("Invalid value generated by tGen(): " + i);
}
或if / else
public int tortoiseMoves()
{
int i = tGen();
if (i >= 1 && i <= 5)
{
int fastplod = 3;
return fastplod;
}
else if (i >= 6 && i <= 8)
{
int slowplod = 1;
return slowplod;
}
else //Code is guaranteed to reach here and return if the previous if statements fail
{
int slip = -6;
return slip;
// OR
// throw new Exception("Invalid value generated by tGen(): " + i);
}
}
答案 4 :(得分:3)
对于给定的函数运行,只有一个if(...)
语句可以为true。因此,使用if/if else/else
结构可能会更清楚。您可以将return
或throw
语句置于if
结构之外,但我认为将其放在else
中会使其更清晰。
public int tortoiseMoves() {
int i = tGen(); // random: 1 <= i <= 10
if (i >= 1 && i <= 5) return 3; // fastplod
else if (i >= 6 && i <= 8) return 1; // slowplod
else if (i >= 9 && i <= 10) return -6; // slip
else throw new IllegalStateException(); // this shouldn't happen!
}
答案 5 :(得分:2)
很简单,如果所有if语句都为false,则代码不知道返回什么内容!
我不知道这是否是一个更好的解决方案:
public int tortoiseMoves()
{
switch (tGen())
{
case 1:
case 2:
case 3:
case 4:
case 5: return 3; // slowplod
case 6:
case 7:
case 8: return 1; // fastplod
case 9:
case 10: return -6; // slip
default: return 0; // default value if not in range
}
}
解决方案2(查找表)://最快不使用切换或分支使用if
public int tortoiseMoves()
{
int[] moves = {3,3,3,3,3,1,1,1,-6,-6};
return moves[tGen()-1];
}
小心ArrayOutOfBondException!
答案 6 :(得分:1)
警告:许多评论表明您的错误是由于没有告诉编译器如何处理所有条件。但是,重要的是要意识到即使用if
/ if else
覆盖所有可能的条件,编译器仍然会抱怨。
public boolean isPositive(int x){
if(x > 0) return true;
else if(x <= 0) return false;
// error: "This method must return a result of type boolean"
}
在这种情况下,编译器在技术上有足够的信息来确定上述语句之一必须为真,因为x ∈ ℤ = {x | x ≤ 0} ⋃ {x | x > 0}
。但是,您仍然需要在return
内或else
结构之外的最后if
。