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

时间:2018-03-29 16:11:03

标签: java for-loop try-catch

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

i

但它只打印两次。每当我在客户端输入内容时,for循环再次运行,""为1.所以我从中得到的是for循环等待if循环运行完毕直到它再次运行。但情况并非如此,因为它只应检查重启是否等于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循环。如果有人已经提出这个问题,我已提前抱歉,我已经尝试过寻找这个问题,但没有成功。您应该记住的一个细节是,在客户关闭窗口之前,捕获并不会捕获任何内容。

以下是代码:

$_SERVER['REQUEST_URI']

4 个答案:

答案 0 :(得分:1)

所以我认为我在你的代码中发现了问题,你每次都在阅读客户端输入并在每次用户输入内容时触发for循环但是在while之后的第一行你的if子句是错误的,你'如果用户输入“”之外的任何内容,请重新打开while循环:

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

如果用户输入的内容如下,则应该打破循环:

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

请从您身边测试并告诉它是否有效。

答案 1 :(得分:1)

在捕获IOException之后尝试捕获throwable。您可能无法获得IOException。您也可以登录该catch块并在需要时再次抛出throwable

您正在为&#39; threads [i] .clientName&#39;打印一个值。但然后检查线程[i]&#39;是null,所以这里可能会出现空指针异常吗?

编辑: 要捕获throwable,只需将其添加到代码中:

...
    } 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");

答案 2 :(得分:0)

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

答案 3 :(得分:0)

基本上,我有两个客户端连接到服务器,这就是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("");的原因是因为我需要它来打破所有循环所以我只是将它发送到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循环只是将消息发送给连接到服务器的每个客户端。