Java 为什么这会给我一个错误(多线程或ArrayList)?
我有两个线程正在运行,我需要控制子弹是否碰到敌人,但它给了我这个问题,我打印了“s4”。知道那里发生了什么吗?我是个初学者。我正在使用JavaJava 为什么这会给我一个错误(多线程或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
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();
}
}
...