【问题标题】:Missing return statement inside a for loopfor循环中缺少return语句
【发布时间】:2025-06-22 14:25:01
【问题描述】:

我可以找到与此类似的问题,但我无法找到我期望的这个特定案例的答案。

public int getIndex(){
    for(int x = 0; x < 5; x++) {
        return x;
    }
}

当我执行这段代码时,我得到一个编译错误,说“缺少返回语句”。但是,据我所知,很明显 for 循环中的代码将毫无疑问地执行,因为第一次 x=0。因此,对于这种特殊情况,没有任何情况不执行 for 循环内的代码。 那么,为什么我们还需要在 for 循环之外声明一个额外的 return 语句呢?

【问题讨论】:

  • 这是真实的代码吗?你可以把它改成返回0。你能举一个真实的例子吗?
  • 伙计们,这显然是一个理论问题,他在问为什么我们需要在 for 循环之外有一个 return 才能正常工作,即使它显然永远不会达到另一个return
  • @JoakimDanielson 代码确实有意义。它不是特别有用(从功能上讲),但它使问题变得相当清晰。
  • @Joakim Danielson 我指的是那些试图“修复”代码并询问代码用例的人,代码的 use 无关紧要,他想知道是为了知识,但这并不意味着它一定会有用。而且很多人都清楚他的意思,所以我认为代码还不错。
  • @JoakimDanielson 不,这就是重点。这不是逻辑错误。这只是糟糕的代码。就像每天在这里发布的大量错误代码一样。如果人们没有发布错误的代码(甚至是逻辑错误),这个网站就不需要存在。此外,我希望我的编译器能够检测到实际的逻辑错误,但是,可惜它没有。

标签: java loops return


【解决方案1】:

与您不同,编译器无法(或者更确切地说,不会尝试)确定循环至少执行一次。

关于此的具体规则在JLS 14.21 中给出。特别是:

如果以下至少一项为真,则基本 for 语句可以正常完成:

  • for 语句可达,存在条件表达式,且条件表达式不是值为 true 的常量表达式(第 15.28 节)。

  • 有一个可到达的 break 语句退出 for 语句。

如果 for 语句可访问且条件表达式不是值为 false 的常量表达式,则包含的语句是可访问的。

你没有常量条件表达式,所以编译器认为这样的for循环可以正常完成,因此后面的语句是可达的。

It would work 如果i &lt; 5 是常量表达式,例如true,则无需进一步的返回语句。

public int getIndex(){
    for(int x = 0; true; x++) {
        return x;
    }
}

考虑到关于可达性的复杂得多的规则,编译器可以确定您的原始循环从未正常完成,但实际用例非常小,无法证明复杂性是合理的。

【讨论】:

    【解决方案2】:

    这是因为 JVM 不知道您将在循环中使用的条件中断。例如:

    public static int getIndex(){
      for(int x=0; x<5;x++){
        if(x<5) continue;
        return x;
      }
      return 6;
    }
    

    很明显,如果没有循环外的返回,您可能会错过循环内的返回语句

    【讨论】:

    • JVM确实有一个想法,在某个点上。另一方面,编译器...
    【解决方案3】:

    我建议您的示例不是真实的,但是您可以将其更改为 do-while 而不会出现编译错误:

    public static int getIndex() {
        int x = 0;
        do {
            return x++;         
        } while (x < 5);
    }
    

    【讨论】:

    • @FedericoklezCulloca return 在循环执行之前,因此无需在循环之后添加 return
    • 这不会永远循环并且总是只返回x的起始值吗?编辑:没关系,我很笨,我忘了他也是这样。
    【解决方案4】:

    在你的函数中

    - 此方法必须返回 int 类型的结果

    错误生成

    bcz

    public static int getIndex(){
            for(int x = 0; x < 5; x++) {
                return x;
            }  
        }
    

    在函数外没有指定返回值 默认返回

    public static int getIndex(){
            for(int x = 0; x < 5; x++) {
                return x;
            }  
           return 0; <---------
        }
    

    【讨论】:

      【解决方案5】:

      这些条件在编译时是无法理解的,而在运行时它们可以被 JVM 理解。但是要编译代码,它需要在 for 循环之外有一个 return 语句。所以要编译代码,理论上你必须有一个 return 语句。

      【讨论】: