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

问题描述 投票:-1回答:1

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

每当我运行setTranslateX时,我都会在随机索引处获得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();
        });
    }
}

这个错误可能发生在第二个圆产生或第三个或第五个等之后。我设置我的x = 1,因为我传递给这个方法的ArrayList中的第一个元素只是一个小字符串,知道我将使用ArrayList做什么。在这种情况下,请更新。第二个是X坐标,第三个是Y.感觉就像foreach循环在我添加一个新圆圈后多次运行一次。我只在循环后添加新的圆圈,并通过另一个arraylist进行。

任何提示将不胜感激。谢谢你的时间。

java arraylist
1个回答
0
投票

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

我通过在我的服务器中添加2个易失整数“修复”了这个问题。我用这些整数来检查我是否在Platform.runLater中完成了所有操作。服务器保持在一个什么都不做的while循环中,只等到Platform.runLater部分完成并更改了这个整数的值,这样Server Thread可以在循环时退出并继续。我不再得到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;
    }
}

是一个丑陋的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.