缺少多个IF的return语句

时间:2015-03-16 17:57:54

标签: java variables if-statement return

问题出在哪里?如果我使用变量它可以正常工作,但我错过了一些东西。

public boolean xyzThere(String str) {
  if (str.length() > 2){
    if(str.startsWith("xyz")){
        return true;
    } else {
        for (int i = 1; i < str.length() - 2; i++){
            if(str.substring(i, i + 3).equals("xyz") && !str.substring(i - 1, i).equals(".")) {
                return true;
            } else {
                return false;
            }
        }
    }
  } else {
  return false;
  }
}

4 个答案:

答案 0 :(得分:1)

这个条件需要一个return语句,因为for循环中的代码可能无法访问。

else {
                for (int i = 1; i < str.length() - 2; i++) {
                    if (str.substring(i, i + 3).equals("xyz") && !str.substring(i - 1, i).equals(".")) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }

答案 1 :(得分:0)

Java编译器不会评估条件,以确定是否可以保证if条件和else if条件之一运行。

如果没有条件,编译器会看到两个条件都不是true的可能性,在这种情况下,不返回任何内容。 return之后没有else if个语句。即使我们发现逻辑上其中一个将是true,也会发生这种情况。

只需将else if转换为else即可满足编译器。

else {
    return false;
}

现在,编译器将看到所有可能的执行路径中都有return语句。

在这些情况下,有时我会评论条件,让读者知道真正的意图。

else // if (str.length() < 3)
{
    return false;
}

<强>更新

for循环内发生了类似的事情。编译器不会假设将发生for循环的至少一次迭代。如果永远不会输入for循环体,则else块结束,外部if块的正文结束时没有return语句。

如果永远不会输入return循环,则必须在for循环后提供for语句。

答案 2 :(得分:0)

因为您的outer if条件可能无法成功,所以 编译器 会确保您的程序不会陷入此功能,抛出missing return statement错误

所以试试这个:

if(condition){
return false;
}
elseif(condition){
return true;
}
return false; <--- Now compiler is assured that function will return something 

假设返回类型为 布尔

答案 3 :(得分:0)

现在正在编译:

public boolean xyzThere(String str) {
  if (str.length() < 3){
  return false;
  } else {
    if(str.startsWith("xyz")){
        return true;
    } else {
        for (int i = 1; i < str.length() - 2; i++){
            if(str.substring(i, i + 3).equals("xyz") && !str.substring(i - 1, i).equals(".")) {
                return true;
            } else {
            }
        }
        return false;
    } 
  }
}