Java 对于循环isn';t每次循环时添加1

Java 对于循环isn';t每次循环时添加1,java,for-loop,try-catch,Java,For Loop,Try Catch,如果这是一个愚蠢的问题,我真的很抱歉,我只需要别人的观点。我有一段代码,其中我正在将客户机中的输出流打印到服务器。出于某种原因,for循环并不是每次循环时都向i添加1。无论何时运行它,我都会得到: threads[i]:Thread[Thread-2,5,main]threads[i]。客户端名称:Bill maxClientsCount:15 i:0 线程[i]:线程[Thread-2,5,main]线程[i]。客户端名称:Bill MaxClientScont:15 i:0 但它只打印了两次

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

threads[i]:Thread[Thread-2,5,main]threads[i]。客户端名称:Bill maxClientsCount:15 i:0
线程[i]:线程[Thread-2,5,main]线程[i]。客户端名称:Bill MaxClientScont:15 i:0

但它只打印了两次。每当我在客户机中键入某个内容时,for循环就会再次运行,
I
为1。所以我从中得到的是for循环等待if循环完成运行,直到它再次运行。但情况不应该是这样,因为它应该只检查restart是否不等于
,然后转到for循环。我事先很抱歉,如果有人已经问过这个问题,我已经尝试过寻找这个问题,但没有成功。您应该记住的一个细节是,在客户端关闭窗口之前,catch不会捕获任何内容

代码如下:

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");
while(true){
重启=客户端;
如果(!restart.equals(“”){
打破
}
int j=0;
试一试{
对于(int i=0;i
我怀疑MaxClientScont等于1,因此for循环只执行一次。While循环从不设置为false,因此它会继续执行for循环,使其看起来不递增

所以我想我发现了代码中的问题,您每次都在读取客户端输入,每次用户输入某个内容时都会触发for循环,但是while之后第一行的if子句是错误的,如果用户输入的不是“”之类的内容,您就破坏了while循环:

if (!restart.equals("")) {
        break;
    }
如果用户输入的内容与以下内容不同,则应中断循环:

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

请从您的侧面测试它,并告诉它是否有效。

捕获IOException后,尝试捕获一个可丢弃的。您可能不会得到IOException。您也可以登录到catch块,如果需要,可以再次抛出throwable

您正在打印“threads[i].clientName”的值,但随后检查“threads[i]”是否为null,因此可能发生了null指针异常

编辑: 要捕获可丢弃的内容,只需在代码中添加以下内容:

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

所以基本上,我有两个客户端连接到服务器,这就是为什么syso要打印两行。当我意识到这两个客户端已经连接到服务器时,我意识到我所需要做的就是检查
这个
线程是否仍然连接,如下所示:

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;
}
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循环只向连接到服务器的每个客户端发送消息。

MaxClientScont的大小是多少?我猜while循环运行了两次,而for循环只运行了一次,因为MaxClientScont为1,并且只能进行一次迭代。@EyadMhanna 15。我也检查过:(也许你有两个objects@humblefoolish你能详细说明一下吗?我已经检查了MaxClientScont及其15的值。他在评论中说它是15--这也不起作用,因为这是一个捕捉器,可以查看用户是否在服务器中键入了内容,然后他仍然在那里,因此不需要检查用户是否已退出ut说“/quit”我可以将其更改为if(!restart.equals(null))好的!我取得了突破!检查我编辑的问题!它没有给我任何类型的错误,它正在打印线程[I]如我的问题所示。你能详细说明一下你的第一个反应吗?如果你的代码抛出IOException以外的东西,你将看不到日志中的任何东西,因为这就是你正在捕获的东西。如果你使用“Throwable”,你将确保你记录抛出的任何错误-如果你的第二个错误是数组中的ntry为null,那么当println尝试解析“threads[i]时,它将抛出NullPointerException.clientName'。至于为什么要打印两次行,我只能假设您进入循环两次。代码中的任何内容看起来都不应该这样做。我发现了一件小事,它不是因为我在类的开头声明而抛出NullPointerException。它是打印两次消息,因为有两个clients连接到服务器,因此有两个线程打印出个人信息。我在回答我自己的问题时对此进行了更详细的说明。虽然我想知道如何使一些东西可以扔掉,但这可以让我的生活更轻松!另外,请检查我的新答案,刚才添加了它。