Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于运行时列表发生更改而导致的每个越界_Java - Fatal编程技术网

Java 由于运行时列表发生更改而导致的每个越界

Java 由于运行时列表发生更改而导致的每个越界,java,Java,有一个基类包含一个子类作为成员。 在上述子类中,我有一个方法,其中有一个for-each循环,我在其中运行一个列表,并在所述列表中的每个变量上运行一个方法。 在所述列表中,有两个对象可以从基类的列表中删除对象,也可以不从基类的列表中删除对象。 问题是由于某种原因,每当所述两个对象从列表中删除一个元素时,循环就会崩溃。有趣的是,出于某种原因,只有当第二个对象从列表中删除一个元素时,程序才会崩溃。我尝试过添加更多这样的变量,出于某种原因,只有倒数第二个对象才能从列表中删除元素,而不会导致程序崩溃。

有一个基类包含一个子类作为成员。 在上述子类中,我有一个方法,其中有一个for-each循环,我在其中运行一个列表,并在所述列表中的每个变量上运行一个方法。 在所述列表中,有两个对象可以从基类的列表中删除对象,也可以不从基类的列表中删除对象。 问题是由于某种原因,每当所述两个对象从列表中删除一个元素时,循环就会崩溃。有趣的是,出于某种原因,只有当第二个对象从列表中删除一个元素时,程序才会崩溃。我尝试过添加更多这样的变量,出于某种原因,只有倒数第二个对象才能从列表中删除元素,而不会导致程序崩溃。 我希望在这件事上能得到一些帮助。添加了一些基本代码:

public class Game {
private SpriteCollection sprites;
public void initialize() {
    sprites.addelement(e1);
    sprites.addelement(e2);
    sprites.addelement(remover removerElement1);
    sprites.addelement(remover removerElement2);
    }
public class spriteCollection {
public java.util.List<Sprite> sprites;
    public void notifyAllTimePassed() {
            for (Sprite c : sprites) {  // for each sprite
                c.timePassed(); // move it
            }
        }
    }
public class remover {
public void timePassed() {
removesprite(e1, game) // removing the element from the game which 
 // contains the sprite collection the remover element is a part of
    }
}
公共类游戏{
私人精灵收集精灵;
公共无效初始化(){
精灵.附加元素(e1);
雪碧.补体(e2);
雪碧.添加剂(去除剂去除剂1);
雪碧.添加剂(去除剂去除剂2);
}
公共类spriteCollection{
public java.util.List精灵;
public void notifyAllTimePassed(){
对于(精灵c:精灵){//对于每个精灵
c、 timePassed();//移动它
}
}
}
公共类清除器{
公共无效时间已过(){
removesprite(e1,游戏)//从游戏中删除
//包含移除器元素所属的精灵集合
}
}

我在调试时找到了一个相当方便的解决方案。 我没有使用for-each循环,而是选择使用迭代器,发现它简单得多。所需要的只是:

for (Sprite c : sprites) {  // for each sprite
            c.timePassed(); // move it
        }
带着

for (int i = 0; i < sprites.size(); i++) {
        Sprite tempSprite = sprites.get(i);
        tempSprite.timePassed();
    }
for(int i=0;i
因此,如果大小减小,整个过程将立即停止,而不是运行空索引。
这个解决方案相当平庸,我真的很惊讶这么长时间以来我一直被这个问题困扰着。

我在你的问题中没有看到子类,但在任何情况下-你都不允许在迭代列表时更改它。这将导致一个
ConcurrentModificationException
。如果你想删除元素,你必须使用迭代器,而不是使用一个
for
循环。@realponsignist指出,这实际上解决了我的大部分问题,非常感谢!这实际上不是使用迭代器。您使用的是索引。如果删除一个元素,您可能会跳过索引。