for循环中缺少return语句

Posted

技术标签:

【中文标题】for循环中缺少return语句【英文标题】:Missing return statement inside a for loop 【发布时间】:2019-10-07 20:29:47 【问题描述】:

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

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 不,这就是重点。这不是逻辑错误。这只是糟糕的代码。就像每天在这里发布的大量错误代码一样。如果人们没有发布错误的代码(甚至是逻辑错误),这个网站就不需要存在。此外,我希望我的编译器能够检测到实际的逻辑错误,但是,可惜它没有。 【参考方案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 语句。

【讨论】:

以上是关于for循环中缺少return语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 for 循环中使用 return 语句?

我在 for 循环和 return 语句中一直犯的一个错误

在js中怎么结束当前for循环?

break continue return

return break 和continue在for循环中的不同作用

return break 和continue在for循环中的不同作用