Java在不同索引上随机获取IndexOutOfBoundsException

Java在不同索引上随机获取IndexOutOfBoundsException,java,arraylist,Java,Arraylist,我有两个客户端连接到服务器,它们发送新坐标或生成新圆,服务器更新圆的位置或创建新圆并绘制它们。我使用一个延时为5秒、间隔为5秒的timertask来生成新的圆圈 每当我在设置TranslateX时运行应用程序时,我总是在随机索引中获取IndexOutOfBoundsException private void updateSimulation(ArrayList<String> cl) { if(cl == translatedCoorsMessage) {

我有两个客户端连接到服务器,它们发送新坐标或生成新圆,服务器更新圆的位置或创建新圆并绘制它们。我使用一个延时为5秒、间隔为5秒的timertask来生成新的圆圈

每当我在设置TranslateX时运行应用程序时,我总是在随机索引中获取IndexOutOfBoundsException

private void updateSimulation(ArrayList<String> cl) {
    if(cl == translatedCoorsMessage) {
        Platform.runLater(() -> {
            int x= 1;
            for(Circle circle : circlesOnCorridorOfClient) {
                circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 20.0)/1000);
                x=x+2;
            }
            circlesOnCorridorOfClient.addAll(newCirclesToAddOnCorridor);
            newCirclesToAddOnCorridor.clear();
        });
    }
    else {
        Platform.runLater(() -> {
            int x= 1;
            for(Circle circle : circlesOnCorridorOfClient1) {
                circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 967.0)/1000);
                x=x+2;
            }
            circlesOnCorridorOfClient1.addAll(newCirclesToAddOnCorridor1);
            newCirclesToAddOnCorridor1.clear();
        });
    }
}
private void updateSimulation(ArrayList cl){
if(cl==translatedCoorsMessage){
Platform.runLater(()->{
int x=1;
用于(圆圈:圆圈OnCorridorOfClient){
circle.setTranslateX(((Double.parseDouble(cl.get(x)))-20.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient.addAll(新CirclesToadOn走廊);
newCircleStoadOn走廊。清除();
});
}
否则{
Platform.runLater(()->{
int x=1;
用于(圆圈:圆圈OnCorridorOfClient 1){
circle.setTranslateX(((Double.parseDouble(cl.get(x)))-967.0)/1000);
x=x+2;
}
CirclesOnCorridorOfClient 1.addAll(新CirclesToadOnCorridor1);
newCircleStoredOnCorridor1.clear();
});
}
}
这个错误可能发生在第二个圆、第三个圆或第五个圆产生后,等等。我设置我的x=1,因为我传递给这个方法的ArrayList中的第一个元素只是一个小字符串,以知道我将如何处理ArrayList。在这种情况下,请更新。第二个是X坐标,第三个是Y坐标。 在我添加一个新的圆之后,感觉foreach循环多运行了一次。我只在循环后添加新的圆,并通过另一个arraylist进行添加


任何提示都将受到重视。谢谢您的时间。

我不确定,但我认为问题在于我在Platform.runLater中所做的一切都发生在另一个线程(应用程序线程)中。因此,我的服务器正在更新并添加新的圆圈(这些圆圈添加到单独的ArrayList中以避免ConcurrentModificationException),然后在更新每个圆圈位置后,我将新的圆圈添加到主ArrayList中。这就是问题所在,有一瞬间我多了一个圆圈

我通过在服务器中添加2个可变整数“修复”了这个问题。我使用这些整数检查我是否在Platform.runLater中完成了所有操作。服务器停留在一个while循环中,该循环不执行任何操作,只是等待Platform.runLater部分完成并更改此整数的值,以便服务器线程可以退出此while循环并继续。 我不再有IndexOutOfBoundsException的感觉,但是“动画”真的很慢

private void updateSimulation(ArrayList<String> cl) {
    if(cl == translatedCoorsMessage) {
        Platform.runLater(() -> {
            int x= 1;
            for(Circle circle : circlesOnCorridorOfClient) {
                circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 20.0)/1000);
                x=x+2;
            }
            circlesOnCorridorOfClient.addAll(newCirclesToAddOnCorridor);
            newCirclesToAddOnCorridor.clear();
            testtest = 1;
        });
        while(testtest == 0){
            //waiting
        }
        testtest = 0;
    }
    else {
    Platform.runLater(() -> {
        int x= 1;
        for(Circle circle : circlesOnCorridorOfClient1) {
            circle.setTranslateX(((Double.parseDouble(cl.get(x))) - 967.0)/1000);
            x=x+2;
        }
        circlesOnCorridorOfClient1.addAll(newCirclesToAddOnCorridor1);
        newCirclesToAddOnCorridor1.clear();
        testtest1 = 1;
    });
            while(testtest1 == 0){
                //waiting
            }
            testtest1=0;
    }
}
private void updateSimulation(ArrayList cl){
if(cl==translatedCoorsMessage){
Platform.runLater(()->{
int x=1;
用于(圆圈:圆圈OnCorridorOfClient){
circle.setTranslateX(((Double.parseDouble(cl.get(x)))-20.0)/1000);
x=x+2;
}
circlesOnCorridorOfClient.addAll(新CirclesToadOn走廊);
newCircleStoadOn走廊。清除();
testtest=1;
});
while(testtest==0){
//等待
}
testtest=0;
}
否则{
Platform.runLater(()->{
int x=1;
用于(圆圈:圆圈OnCorridorOfClient 1){
circle.setTranslateX(((Double.parseDouble(cl.get(x)))-967.0)/1000);
x=x+2;
}
CirclesOnCorridorOfClient 1.addAll(新CirclesToadOnCorridor1);
newCircleStoredOnCorridor1.clear();
test1=1;
});
while(test1==0){
//等待
}
test1=0;
}
}

是一个丑陋的解决方案。

错误在于
cl.get(x)
有时无效。即使不考虑并发问题和修改共享ArrayList,此故障似乎也是“预期的”,因为没有有效的逻辑确定
x
是否有效,或者将其限制在有效范围内-错误发生时
cl
中有多少项?这比预期的要少该错误与“setTranslateX”无关,后者也可以替换为“println”。而且,如果此
Platform.runLater
在不同的线程上运行,则可能存在其他线程安全冲突。还要注意,
cl==translatedCoorsMessage
中的
==translatedCoorsMessage
可疑如果是字段,“circlesOnCorridorOfClient”和“circlesOnCorridorOfClient 1”是什么,请检查它们可以修改的其他位置。请提供异常跟踪器或行号异常发生。将索引增加2的原因是什么<代码>x=x+2很抱歉回答延迟,我正在工作@用户2864740所以我应该尝试另一种方法来更新我的圆圈位置?我真的不明白你对我的信用卡是什么意思。有时我的信用卡是无效的。是因为我想得到一个被修改过的x吗?