缺少多个 IF 的 return 语句

Missing return Statement of multiple IFs

问题出在哪里?如果我使用一个变量,它工作得很好,但我遗漏了一些东西。

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

此条件需要 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;
                    }
                }
            }

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

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

,也会发生这种情况

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

else {
    return false;
}

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

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

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

更新:

for 循环中发生了类似的事情。编译器不会假定至少会发生 for 循环的一次迭代。如果从未进入 for 循环体,则 else 块结束,并且外部 if 块的主体在没有 return 语句的情况下结束。

您必须在 for 循环之后提供一个 return 语句,以防永远不会进入 for 循环。

因为您的 outer if 条件的 none 可能成功,所以 Compiler 正在制作通过抛出 missing return statement 错误

确保您的程序不会卡在函数中

所以试试这个方法:

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

假设 return 类型是 boolean

正在编译中:

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