【问题标题】:Missing return Statement of multiple IFs缺少多个 IF 的 return 语句
【发布时间】:2015-05-18 23:25:43
【问题描述】:

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

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

【问题讨论】:

  • 你有两个条件。编译器无法检查它们不能为假。
  • 删除最后一个else { return false; },并添加return false;作为方法中的最后一个语句。

标签: java variables if-statement return


【解决方案1】:

现在正在编译:

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

【讨论】:

    【解决方案2】:

    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 循环。

    【讨论】:

    • 这并不能解决问题
    • 看起来我发现了两个相关问题之一。已更新。
    【解决方案3】:

    因为您的 outer if 条件可能都不成功,所以 编译器 确保您的程序不会卡在函数中,通过抛出missing return statement 错误

    所以试试这个方法:

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

    假设返回类型是boolean

    【讨论】:

    • 在我看来总是检查条件(字符串的长度)时,外部 if 怎么可能不成功?
    • 你知道,我也知道,但是 java 的小天真的 compiler 不知道,他只是确保在运行时没有人遇到麻烦!为什么不当String的长度小于2时肯定是假的
    【解决方案4】:

    这个条件需要一个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;
                        }
                    }
                }
    

    【讨论】:

      最近更新 更多