当前位置: 首页 > 知识库问答 >
问题:

无限循环中断方法签名而没有编译错误[duplicate]

彭洲
2023-03-14

我想知道为什么在Java中允许使用以下代码,而不会出现编译错误?在我看来,这段代码通过不返回任何string来破坏方法签名。谁能解释一下我错过了什么吗?

public class Loop {

  private String withoutReturnStatement() {
    while(true) {}
  }

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}

共有1个答案

鱼浩荡
2023-03-14

方法的最后}是不可访问的--只有在可以在不返回值的情况下到达方法的末尾时,才会出现编译错误。

这对于由于异常而无法到达方法结尾的情况更有用,例如。

private String find(int minLength) {
    for (String string : strings) {
        if (string.length() >= minLength) {
            return string;
        }
    }
    throw new SomeExceptionIndicatingTheProblem("...");
}

这方面的规则见JLS第8.4.7节:

while语句可以正常完成,前提是以下至少有一项为真:

  • while语句是可达的,并且条件表达式不是值为true的常量表达式(§15.28)。
  • 有一个可访问的break语句退出while语句。

在您的示例中,条件表达式是一个值为true的常量,并且没有任何break语句(可达或其他),因此while语句无法正常完成。

 类似资料:
  • 问题内容: 我想知道为什么在Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回any来破坏方法签名。有人可以解释一下我在这里想念的东西吗? 问题答案: 该方法的最终版本无法访问-只有在可能返回方法末尾而不返回值的情况下,您才会收到编译错误。 这在由于异常而导致方法的末尾无法到达的情况下更有用。 规则在JLS第8.4.7节中: 如果声明某个方法具有返回类型(第8.4.5节),则如

  • 我正在尝试开发一个喷气背包组合项目 我已经下载了Android Studio Arctic Fox 2020.3。1金丝雀9型 然后,我尝试创建一个带有“空撰写活动”的示例项目 但是在构建应用程序时,我得到了以下错误 我的Gradle配置是

  • 问题内容: 尽管我知道问这个问题会有点愚蠢,但我仍然想查询有关它的技术观点的更多信息。 无限循环的简单示例: 如何从此类外部中断(停止)此无限循环(例如,在继承的帮助下)? 问题答案: 即使写这篇文章我也觉得很脏,但是… 从不同的线程,你可以调用一个实现,抛出一个当你调用。

  • 问题内容: 我必须使用测试工具编译我的代码,但是,当该测试工具调用我的方法时,我收到此错误: “课程Course中的getCourseDetails方法不能应用于给定类型; 必需:java.lang.String,int,java.lang.String,boolean,java.lang.String.java.lang.String,double 找到:没有参数 原因:实际参数列表和形式参数列

  • 我是Java企业开发领域的新手。我所在组织的Java大师正在无限期探亲假,我被分配了维护他开发的一些Java应用程序的任务。他在离开之前用Maven在我的计算机上安装了Eclipse[Kepler SR1],看起来工作正常。 现在我已经准备好部署我的第一个修改,并且需要运行Maven,但是我很难让它工作--我在我的控制台上得到以下输出: [错误]无法执行目标org.apache.maven.plu

  • 我一直在研究GNU的g编译器编译的汇编,它看起来像一个无限循环(g -S file.c -o的部分输出): 除了最后一条jmp指令之外,所有这些指令都是movq或计算指令,但这只是让我们回到.L3。这是以下代码的主体: 它是如何退出循环的?看起来它只是减少了i(subq$1,-8(%rbp)),并在没有比较的情况下重新启动。