while(true) 不等于 while(!false)

while(true) does not equals while(!false)

我目前正在开发一个 client/server 软件的项目。我有一个奇怪的问题,希望能解决它,但我完全无法解释原因,我搜索了很长时间。

我想在服务器端有一个 while(true) 循环来强制服务器在前一个关闭套接字之后继续接受客户端。

所以我试着这样构建它:

public void run() {

    Socket socket;

    while(true) {
        try {
            socket = server.accept();

            BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
            BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

            while (socket.isConnected()) {
                // TODO income handling
            }

            in.close();
            out.close();
            socket.close();

        } catch (Exception e) {
            break;
        }
    }
}

但是我收到了 Intellij 的错误消息,告诉我要为此循环添加结束条件。但是我在捕获语句中有一个。改变

while(true)

while(!false)

已导致错误消息消失。任何人都可以向我解释其中的区别以及为什么第一次尝试没有成功吗?我在研究过程中发现它多次这样做。

这可能是因为您格式化 while 循环条件的方式。 如果表达式复杂或令人费解。编译器没有意识到这些语句是相同的,如 T.J。克劳德如上所述。另一种解释是您创建的 while(!false) 实际上不是 while(!false)。显示您将 while 循环更改为的内容,以获得其他人更清晰的帮助。

您这样做是在修补您的应用程序。

IDE(IntelliJ) 检测到您正在做一些您不应该做的事情并且您试图避免 IntelliJ 试图通过添加更糟糕的事情来防止您的不良做法。

将条件更改为某个时刻可以完成的条件或使用标志评估。

顺便说一下,在无限循环中声明无限 类 和实例是一种糟糕的做法。

首先,IntellJ IDEA检查的目的是帮助你快速发现有问题的代码,而不是让你的日子不好过。 您绝对不应该仅仅为了 IDE 开心而更改代码。

默认情况下,此检查(“'while' 语句无法在不引发异常的情况下完成”)产生警告。 因此,如果您真的收到 error,那么您可能不小心更改了此检查的设置。 可以在“编辑器”>“检查”选项卡的“设置”对话框中找到可用检查列表及其严重性设置。

关于while (true)while (!false)的区别: 它们都将生成相同的字节码,因此没有区别,只是缺少这种意图实现。

如果您不想看到针对特定目的的警告,您可以:

  1. 将文本插入符号放在突出显示的代码上(在本例中为 while
  2. Alt-Enter
  3. 在刚刚打开的上下文菜单中选择"Inspection 'Infinite loop statement' options"

并且

  • 为此特定语句禁用它(菜单项 "Suppress for statement")
  • 完全禁用此检查(菜单项"Disable inspection")
  • 或打开设置对话框(菜单项 "Edit inspection profile settings")。