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

Java是否可以识别无限循环?

郦楷
2023-03-14
问题内容

给定以下代码示例:

public class WeirdStuff {

    public static int doSomething() {
        while(true);
    }

    public static void main(String[] args) {
        doSomething();
    }
}

这是一个有效的Java程序,尽管doSomething()方法应返回一个int,但永远不会返回。如果运行它,它将以无限循环结束。如果将while循环的参数放在单独的变量中(例如boolean
bool = true),则编译器将告诉您在此方法中返回int。

所以我的问题是:这在Java规范中是否存在,是否存在这种行为可能有用的情况?


问题答案:

我将引用Java语言规范,因为对此很清楚:

本节专门对“可达”一词进行精确的解释。这个想法是,从包含该语句的构造函数,方法,实例初始化程序或静态初始化程序的开头到语句本身必须有某种可能的执行路径。该分析考虑了语句的结构。除了对
while,do和条件表达式的常数值为true的语句特殊处理 外,流分析中不考虑表达式的值。

如果满足以下至少一项条件,则while语句可以正常完成:

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

如果非S语句之前的语句可以正常完成,则可以到达非空块(不是交换块)中的所有其他语句S。

然后将以上定义应用于此:

如果方法声明为具有返回类型,则其主体中的每个return语句(第14.17节)都必须具有一个Expression。如果方法的主体可以正常完成,则会发生编译时错误(第14.1节)。

换句话说,具有返回类型的方法只能通过使用提供值return的return语句来返回;不允许“掉落尸体的末端”。

请注意,方法可能具有声明的返回类型,但不包含任何返回语句。这是一个例子:

class DizzyDean {
  int pitch() { throw new RuntimeException("90 mph?!"); }
}


 类似资料:
  • 问题内容: 如何用Java代码检查当前的JVM是否有无限强度的加密可用? 问题答案: 我认为您可能可以使用Cipher.getMaxAllowedKeyLength(),同时还将您使用的密码与已知的“良好”安全密码(例如AES)列表进行比较。 这是一篇参考文章,列出了自Java 1.4起当前最大的密钥大小管辖权限制(除非法律也有所改变,否则这些可能没有改变-参见下文)。 如果您在有密码进出口限制的

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 我试图用vba做一个按钮来删除Excel表中的一行,但当我按下按钮并选择不止一行或许多单元格时,我想限制从E到I的选择(和行的数量无关)这里是我的代码,非常感谢,希望你能帮助我,我还没有找到任何类似的东西。

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!

  • 我正在编写一个应用程序,它应该接收音频并将其发送到Bing识别API以获取文本。我使用了服务库,它可以使用wav文件。因此,我编写了自己的流类来从麦克风或网络(RTP)接收音频,并将其发送到识别API。当我在音频流前面添加WAV头时,它会工作几秒钟。 调试表明,识别api读取表单流的速度比音频源(16k samplerate,16位,mono)填充的速度快。 所以我的问题是:有没有办法将识别api

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循