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 < 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语句的主要内容,如果未能解决你的问题,请参考以下文章