Java 为什么这会给我一个错误(多线程或ArrayList)?

Java 为什么这会给我一个错误(多线程或ArrayList)?,java,multithreading,arraylist,Java,Multithreading,Arraylist,我有两个线程正在运行,我需要控制子弹是否碰到敌人,但它给了我这个问题,我打印了“s4”。知道那里发生了什么吗?我是个初学者。我正在使用Java ArrayList<Nemico> nemici= o_orda.getNemici(); for (Nemico nemico : nemici) { if(Collisioni.ControllaCollisioni(o_navicella, nemico)){ ne

我有两个线程正在运行,我需要控制子弹是否碰到敌人,但它给了我这个问题,我打印了“s4”。知道那里发生了什么吗?我是个初学者。我正在使用Java

ArrayList<Nemico> nemici= o_orda.getNemici();
        for (Nemico nemico : nemici) {
            if(Collisioni.ControllaCollisioni(o_navicella, nemico)){
                nemici.remove(nemico);
                this.o_navicella.vita-=10;



                break;
            }
            for (Proiettile pro : proiettili){
                System.out.println("s1");
                    if(Collisioni.CollsioniProiettile(pro, nemico)){
                        System.out.println("s2");
                        nemici.remove(nemico);
                        System.out.println("s3");
                        proiettili.remove(pro);
                        System.out.println("s4");
                        break;

                }
                    System.out.println("s5");
            }

            if(ControllaSconfitta()){
                this.giocON=false;
                Disegna();
            }
        }
当冲突发生时,它会冻结游戏。

下面的代码已更新为使用迭代器.remove()而不是ArrayList.remove()。感谢@PeterRader澄清了这些应该如何使用


如果您打算在迭代ArrayList时对其进行修改,则不应使用for-each循环直接对其进行迭代。有两种替代方法,使用迭代器避免对ArrayList本身进行迭代,或者使用Java 8的removeIf()函数

我将给出一个使用迭代器的简单(经过测试)示例,然后尝试修改代码以执行相同的操作:

迭代器示例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class IteratorExample{

     public static void main(String []args){

        ArrayList<Integer> arrList = new ArrayList<Integer>(Arrays.asList(1,2,3));

        // Get an Iterator to iterate over the Integers in arrList

        Iterator<Integer> iterator = arrList.iterator();

        // While iterator hasNext element, access this element with .next() and print it. 
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }


     }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.Iterator;
公共类迭代器示例{
公共静态void main(字符串[]args){
ArrayList arrList=新的ArrayList(Arrays.asList(1,2,3));
//获取一个迭代器来迭代arrList中的整数
迭代器迭代器=arrList.Iterator();
//当迭代器拥有下一个元素时,使用.next()访问该元素并打印它。
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
修改代码以使用迭代器

对于本版本中的任何拼写错误或语法错误,我深表歉意-我无法对其进行测试,但由于它只是一小段代码,所以应该不会有太多错误,希望您能够使用上面的示例来纠正这些错误别忘了也导入java.util.Iterator

ArrayList<Nemico> nemici= o_orda.getNemici();

Iterator<Nemico> nemiciIterator = nemici.iterator();

while (nemiciIterator.hasNext()) {

    nemico = nemiciIterator.next();

    if(Collisioni.ControllaCollisioni(o_navicella, nemico)){
        nemiciIterator.remove(nemico);
        this.o_navicella.vita-=10;
        break;
    }

    Iterator<Proiettile> proIterator = proiettili.iterator();

    while (proIterator.hasNext()) {

        pro = proIterator.next();

        if(Collisioni.CollsioniProiettile(pro, nemico)){
            nemiciIterator.remove(nemico);
            proIterator.remove(pro);
            break;
        }
    }

    if(ControllaSconfitta()){
        this.giocON=false;
        Disegna();
        }
    }
    ...
ArrayList nemici=o_orda.getNemici();
迭代器nemiciterator=nemici.Iterator();
while(nemiciterator.hasNext()){
nemico=nemiciterator.next();
if(碰撞控制碰撞(o_navicella,nemico)){
nemiciterator.remove(nemico);
这个.o_navicella.vita-=10;
打破
}
迭代器proIterator=proiettili.Iterator();
while(proIterator.hasNext()){
pro=proIterator.next();
if(冲突I.冲突I{
nemiciterator.remove(nemico);
proIterator.remove(pro);
打破
}
}
if(ControllaSconfitta()){
giocON=false;
disigna();
}
}
...
资源


这是一个相关的资源。这还包括使用removeIf()的示例

check和fail-fast部分(迭代器,在for-each循环中使用)很可能应该使用带有真实迭代器的循环。然后,您可以使用迭代器在ArrayList中添加或删除。使用getListIterator()可以获得最佳结果。好的,您可以举一个例子说明我的代码如何使用迭代器吗?Thanks@PeterRader谢谢你,不过我不确定这是否正确。我不希望从迭代器中删除该项,我希望从ArrayList本身(nemici)中删除它,就像原始海报试图做的那样。Iterator.next()从迭代器中删除对象并返回它,因此不需要显式删除它(我甚至不确定Iterator.remove()是否是一个方法)。从迭代器中删除对象仍然会将它们保留在初始ArrayList中,不是吗?你能澄清一下吗?@PeterRader嗨,Peter,非常感谢你的澄清-我没有意识到这是事实。我现在已经相应地更新了答案,希望这现在是正确的。汤姆为您服务,回答得很好!
ArrayList<Nemico> nemici= o_orda.getNemici();

Iterator<Nemico> nemiciIterator = nemici.iterator();

while (nemiciIterator.hasNext()) {

    nemico = nemiciIterator.next();

    if(Collisioni.ControllaCollisioni(o_navicella, nemico)){
        nemiciIterator.remove(nemico);
        this.o_navicella.vita-=10;
        break;
    }

    Iterator<Proiettile> proIterator = proiettili.iterator();

    while (proIterator.hasNext()) {

        pro = proIterator.next();

        if(Collisioni.CollsioniProiettile(pro, nemico)){
            nemiciIterator.remove(nemico);
            proIterator.remove(pro);
            break;
        }
    }

    if(ControllaSconfitta()){
        this.giocON=false;
        Disegna();
        }
    }
    ...