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

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

公西苗宣
2023-03-14
问题内容

我想知道为什么在Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回any来破坏方法签名String。有人可以解释一下我在这里想念的东西吗?

public class Loop {

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

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

问题答案:

}方法的最终版本无法访问-只有在可能返回方法末尾而不返回值的情况下,您才会收到编译错误。

这在由于异常而导致方法的末尾无法到达的情况下更有用。

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

规则在JLS第8.4.7节中:

如果声明某个方法具有返回类型(第8.4.5节),则如果该方法的主体可以正常完成(第14.1节),则会发生编译时错误。

您的方法无法正常完成,因此没有错误。重要的是,不仅是它不能正常完成,而且规范还 承认 它不能正常完成。从JLS
14.21开始

while当且仅当下面至少有一个为真语句可以正常完成:

  • while语句是可到达的,条件表达式不是带有value的常数表达式(第15.28节)true
  • 有一个可到达的break语句退出该while语句。

在您的情况下,条件表达式
一个带有value的常量true,并且没有任何break语句(可到达或其他方式),因此该while语句无法正常完成。



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

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

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

  • MongoCredential.createCredential()对根据文档(Groovy with gmongo)看来有效的参数抛出错误响应。 我试图执行的代码: 得到以下错误: Groovy.lang.MissingMethodException:方法没有签名:静态com.mongodb.mongoCredential.createCredential()适用于参数类型:(java.lang

  • 在Groovy中使用以下代码时。。。 ...我得到以下例外: 捕获:groovy.lang.丢失方法异常:方法printDocument()的签名不适用于参数类型(java.lang.字符串,java.lang.字符串,java.lang.整数,java.lang.字符串,java.lang.字符串,java.lang.整数,java.lang.整数,java.lang.整数,java.lang.

  • 问题内容: 我有一个无限的while循环,我想在用户按下某个键时退出。通常,我用来获取用户的响应。但是,我不必等待响应。我想要这样的东西: 这应该很简单,但是我似乎无法弄清楚。我倾向于使用线程的解决方案,但我不想这样做。我该怎么做? 问题答案: 我认为您可以使用msvcrt做得更好: 可悲的是,仍然是特定于Windows的。