【问题标题】:"Missing return statement" within if / for / whileif / for / while 中的“缺少返回语句”
【发布时间】:2014-05-28 06:59:16
【问题描述】:

我对 if() while()for() 语句中使用的 return 语句有疑问。

正如您在下面的方法中看到的,它期望 I return 是一个字符串值。问题是,如果我在 if 语句块中使用 return 语句,编译器将返回错误 missing return statement

public String myMethod()
{
    if(condition)
    {
        return x;
    }
}

当然,我可以将方法头更改为void 并使用System.out.println 而不是return。但这是正确的方法吗?我错过了什么吗?

【问题讨论】:

  • 如果条件不成立会怎样?在这种情况下,您的方法返回什么?
  • 如果未找到该值,您可以返回默认值(如 null)。调用该方法时,您会检查该值是否等于默认值,从而可以检查是否应进一步处理返回的值。
  • 您应该在if 之后或else 语句中添加return 语句
  • 每条代码路径都需要返回;这里返回的唯一代码路径是 condition 是否为真。

标签: java return


【解决方案1】:

这是因为函数需要返回一个值。想象一下,如果你执行myMethod() 并且它没有进入if(condition) 会发生什么你的函数会返回什么?编译器需要知道在每次可能的函数执行中要返回什么。

检查 Java 文档:

定义:如果方法声明有返回类型,那么必须有 是方法末尾的 return 语句。如果返回 statement is not there 抛出缺少返回语句错误。

如果方法没有返回类型,也会抛出这个错误 并且没有使用 void 声明(即,它被错误地 省略)。

您可以这样做来解决您的问题:

public String myMethod()
{
    String result = null;
    if(condition)
    {
        result = x;
    }
    return result;
}

【讨论】:

    【解决方案2】:

    这将返回字符串仅当条件为真。

    public String myMethod()
    {
        if(condition)
        {
            return x;
        }
        else
            return "";
    }
    

    【讨论】:

      【解决方案3】:

      试一下,好像if condition返回false,所以返回空,否则什么都不返回。

      public String myMethod()
      {
          if(condition)
          {
              return x;
          }
          return ""
      }
      

      因为编译器不知道是否会到达这些 if 块中的任何一个,所以它会给你一个错误。

      【讨论】:

        【解决方案4】:

        那是非法语法。返回变量不是可选的事情。您必须返回您在方法中指定的类型的变量。

        public String myMethod()
        {
            if(condition)
            {
                return x;
            }
        }
        

        你实际上是在说:我保证任何类都可以使用这个方法(公共),我保证它总是会返回一个字符串(字符串)。

        那么你是说如果我的条件为真,我将返回 x。嗯,那太糟糕了。您的承诺中没有任何 IF。你承诺 myMethod 将总是返回一个字符串。

        即使您的条件总是为真,编译器也必须假定它有可能为假。因此,您始终需要在任何条件之外的非 void 方法的末尾添加一个 return以防万一您的所有条件都失败。

        public String myMethod()
        {
            if(condition)
            {
                return x;
            }
            return ""; // Or whatever the default behavior will be if all of your conditions fail to return.
        }
        

        【讨论】:

        • (更正:这不是语法错误/“非法语法”。它是与语义而不是语法有关的编译错误。“语法”错误意味着程序没有符合语言的语法,但 Java 语法中没有强制返回语句的产生式。)
        【解决方案5】:

        如果您在 ifwhilefor 语句中放置了 return 语句,那么它可能会返回值,也可能不会返回值。如果它不会进入这些语句,那么该方法也应该返回一些值(可能为 null)。为确保这一点,编译器将强制您在ifwhilefor 之后编写此返回语句。

        但是,如果您编写了一个 if / else 块并且每个块中都有一个返回,那么编译器就会知道 ifelse 将被执行并且该方法将返回一个价值。所以这次编译器不会强迫你。

        if(condition)
        {
            return;
        }
        else
        {
            return;
        }
        

        【讨论】:

        • 我认为总的来说,他应该知道他需要在每个非 void 方法的最后一个括号之前放置一个 return。因为他下次会用其他人来重新表述他的问题。
        • 我会说使用多个返回语句不是一个解决方案。最好在函数/方法的末尾只有一个return 语句。
        【解决方案6】:

        如果condition 为假,则必须添加return 语句。

        public String myMethod() {
            if(condition) {
                return x;
            }
        
        //  if condition is false you HAVE TO return a string
        //  you could return a string, a empty string or null
            return otherCondition;  
        }
        

        仅供参考:

        Oracle docs for return statement

        【讨论】:

          【解决方案7】:

          无论如何,myMethod() 应该返回一个字符串值。如果你的条件是假的怎么办? - myMethod 是否返回任何内容?答案是否定的,所以你需要为 false 条件定义 return null 或一些字符串值:

          public String myMethod() {
              boolean c = true;
              if (conditions) {
                  return "d";
              }
              return null; // Or some other string value
          }
          

          【讨论】:

            最近更新 更多