当前位置: 首页 > 面试题库 >

编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

卫飞鹏
2023-03-14
问题内容

在以下方法中,即使通过该方法只有一条路径,并且编译器包含一条语句,编译器也会抱怨
缺少returnreturn语句。抑制该错误需要另一条return语句。

public int foo() {
    if (true) {
        return 5;
    }
}

鉴于Java编译器可以识别无限循环,为什么它也不能处理这种情况?链接的问题提示,但不提供此特定情况的详细信息。


问题答案:

JLS14.21,“无法到达的语句”是处理此问题的部分:

if语句(是否具有else部分)以异常方式处理。因此,本节末尾将单独讨论。

最终,它与条件编译的处理方式有关。考虑以下方法:

public int foo() {
    if (DEBUG) {
        return 5;
    }
}

如果DEBUG是,static final boolean true;您可能会认为编译器应该足够聪明,以至于该方法将始终返回5。但是,如果将其更改为false,则该代码将不再有效。

该方法必须在 不更改源代码的情况下对 通过该方法的所有路径有效,从而允许优化的编译器忽略字节码而无需进行源修改,而与标志的值无关。

该链接JLS节的尽头去到显著的细节。



 类似资料:
  • 所以我得到了一个编译器错误,我丢失了一个返回语句,我已经研究了其他类似的问题,但我仍然对这个问题感到困惑。 如果之前有人问过这个问题,我会提前道歉,但我已经看过了其他各种问题,我似乎无法弄清楚这一点。

  • 问题内容: 为什么这给了我一个丢失的退货陈述错误?每个if / else都有返回值,最后一个括号出现错误 问题答案: 每个语句都在一个语句内。虽然从逻辑上讲这是不可能的,但是当所有评估都不为真时,编译器需要返回。 我建议: 我认为,此解决方案可解决编译器问题并稍微提高可读性。 或者,有以下解决方案: 引发异常将使你可以退出方法而无需返回任何信息……因为可以说,如果到达最后一个,显然会出错。

  • 我有一个二维布尔数组“poorSignal”,需要编写一个返回网格的方法,如果数组上的一个点为真,则显示X,如果为假,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“missing return statement”。我也不确定“return”\n在打印阵列时是否可以添加新行。 这是一个赋值问题,所以我不能直接打印它,也不能只打印布尔值——它必须是一个生成网格的方法。

  • 下面的Java不工作,因为它缺少一个return语句。我搞不懂怎么了。有什么想法吗? 即使我去掉字符串u,它也会给出相同的错误,如果我添加int usernameLimit,它也会给出相同的错误。

  • 我正在运行这段java代码,遇到一个错误“缺少返回语句”,请帮助。我在windows中使用cmd运行。

  • 我可以找到类似的问题,但我找不到我对这个特定案例期望的答案。 当我执行这段代码时,我得到一个编译错误,上面写着“缺少返回语句”。但是,据我所知,很明显,for循环中的代码将毫无疑问地执行,因为第一次,x=0。因此,对于这种特殊情况,没有理由不在for循环中执行代码。那么,为什么我们还需要在for循环之外声明一个额外的return语句呢?。