while(true)不等于w​​hile(!false)

时间:2017-12-12 19:12:26

标签: java intellij-idea while-loop 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的错误消息,告诉我在这个循环中添加一个结束条件。但我在catch语句中有一个。改变

while(true)

while(!false)

导致错误消息消失。任何人都可以解释我的区别以及为什么第一次尝试不起作用?我发现它在研究期间多次这样做。

3 个答案:

答案 0 :(得分:2)

首先,IntellJ IDEA检查的目的是帮助您快速发现有问题的代码,而不是让您的生活更加艰难。 你绝对不应该只是为了让你的IDE开心而改变你的代码。

此检查("'虽然'语句无法在不抛出异常的情况下完成")默认情况下会产生警告。 因此,如果您确实遇到错误,那么您可能会意外更改此检查的设置。 可在“编辑器”的“设置”对话框中找到可用检查列表及其严重性设置。检查标签。

关于while (true)while (!false)之间的区别: 它们都会产生相等的字节代码,因此没有差异,只是缺乏这种意图实现。

如果您不想看到特定意图的警告,您可以:

  1. 将文字插入符号放在突出显示的代码上(本例中为while
  2. Alt-Enter
  3. 在刚刚打开的上下文菜单中选择"检查'无限循环语句'选项"
    • 为此特定语句禁用它(菜单项"抑制语句")
    • 完全禁用此检查(菜单项"禁用检查")
    • 或打开设置对话框(菜单项"编辑检查配置文件设置")。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您通过执行此操作来修补您的应用。

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

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

顺便说一下,在无限循环中声明无限类和实例是一种可怕的坏习惯。