繁体   English   中英

for循环不是每次循环都加1

[英]for loop isn't adding 1 each time it loops

如果这是一个愚蠢的问题,我真的很抱歉,我只需要别人的观点。 我有这段代码,在其中我将打印到客户端到服务器的输出流。 由于某些原因,for循环不会在每次循环时加1。 每当我运行它,我都会得到:

threads[i]: Thread[Thread-2,5,main] threads[i].clientName: Bill maxClientsCount: 15 i: 0 threads[i]: Thread[Thread-2,5,main] threads[i].clientName: Bill maxClientsCount: 15 i: 0

但它只打印两次。 每当我在客户端中键入内容时,for循环便以i为1再次运行。因此,我摆脱了这一点,即for循环一直等到if循环完成运行,直到再次运行。 但这不是事实,因为它仅应检查重新启动是否不等于"" ,然后进入for循环。 预先对不起,如果有人已经问过这个问题,我已经尝试寻找这个问题,但是没有成功。 您应该牢记的一个细节是,在客户关闭窗口之前,捕获不会捕获任何东西。

这是代码:

while (true) {
    restart = clientIn;
    if (!restart.equals("")) {
        break;
    }
    int j = 0;
    try {
        for (int i = 0; i < maxClientsCount; i++) {
            System.out.println("threads[i]: " + threads[i] + "threads[i].clientName: "
                            + threads[i].clientName + "maxClientsCount: " + maxClientsCount + "i: " + i);
            if (threads[i] != null && threads[i].clientName != null) {
                j = i + 1;
                System.out.println(threads[i].is.readLine());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        break;
    }
}
System.out.println("broke");

所以我想我在您的代码中发现了问题,您每次都在读取客户端输入,并且每次用户输入内容时都触发for循环,但是while后面的第一行的if子句是错误的,那么您就破坏了如果用户输入“”以外的内容,则执行while循环:

if (!restart.equals("")) {
        break;
    }

您应该做的是,如果用户未输入以下内容,则打破循环:

if (restart.equals("")) {
            break;
        }

请从您的侧面对其进行测试,并确定其是否有效。

捕获IOException后,尝试捕获一个throwable。 可能您没有得到IOException。 您也可以登录该catch块,并在需要时再次抛出throwable

您正在打印'threads [i] .clientName'的值,但是然后检查'threads [i]'是否为空,那么这里可能发生了空指针异常?

编辑:要也捕获一个可抛出对象,只需将其添加到您的代码中:

...
    } catch (IOException e) {
        e.printStackTrace();
        break;
    } catch (Throwable t) {
        System.out.println("I have some other problem: " + t.getMessage());
        t.printStackTrace();
        break;
    }
}
System.out.println("broke");

我怀疑maxClientsCount等于1,因此for循环仅执行一次。 While循环永远不会设置为false,因此它将继续执行for循环,使其看起来好像没有递增。

因此,基本上,我有两个连接到服务器的客户端,这就是syso打印出两行的原因。 当我意识到两个客户端都已连接到服务器时,我意识到我需要做的就是检查this线程是否仍处于连接状态,如下所示:

try {
    for (int i = 0; i < maxClientsCount; i++) {
        long startTime = System.currentTimeMillis();
        if (threads[i] != null && threads[i] == this) {
            while ((System.currentTimeMillis() - startTime) < 1000) {
                if (threads[i].is.read() == -1) {
                    MyClientSocket.input("");
                }
            }
        }                   
    }
} catch (Exception e) {
    break;
}

我加入MyClientSocket.input("");的原因MyClientSocket.input(""); 因为我需要它来打破所有循环,所以我只是将其发送到catch方法。 我包括的另一件事是检测您说是,否或未定义的方法,您可以在下面看到:

restart = clientIn;
if (restart.contains("yes")) {
    run();
} else if (restart.contains("no")) {
    break;
} else if (!restart.equals("")) {
    for (int i = 0; i < maxClientsCount; i++) {
        if (threads[i] != null && threads[i] == this) {
            threads[i].os.println("Sorry I couldn't understand you. Please say yes or no.");
        }
    }
}

最后一个for循环仅将消息发送到连接到服务器的每个客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM