在这个程序中,我保留了一个决斗者列表,当他们的随机int = 0时杀死最好的决斗者。 我的循环接近底部时遇到问题,我收到了这个错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at Duelist.main(Duelist.java:74)
代码
import java.util.Arrays;
import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
public class Duelist implements Comparable{
private String name;
private int chance;
private boolean alive;
public Duelist(String duelistName, int hitChance){
alive = true;
name = duelistName;
chance = hitChance;
}
public String getName(){
return name;
}
public int getChance(){
return chance;
}
public boolean getLife(){
return alive;
}
public void kill(){
alive = false;
}
public int compareTo(Object anotherDuelist) throws ClassCastException {
if (!(anotherDuelist instanceof Duelist))
throw new ClassCastException("A Duelist object expected.");
int anotherDuelistChance = ((Duelist) anotherDuelist).getChance();
return this.chance - anotherDuelistChance;
}
public static void main(String[] args){
ArrayList<Duelist> duelers = new ArrayList<Duelist>(5);
//ArrayList<Duelist> personToKill= new ArrayList<Duelist>(5);
ArrayList<Duelist> rank = new ArrayList<Duelist>(5);
Random generator = new Random();
Duelist Antoine = new Duelist("Antoine", 3);
Duelist Francis = new Duelist("Francis", 6);
Duelist Juliette = new Duelist("Juliettee", 1);
duelers.add(Antoine); duelers.add(Francis); duelers.add(Juliette);
//System.out.println(duelers);
//for(Duelist element : duelers){
// System.out.println(element.getName());
// System.out.println(element.getChance());
//}
Collections.sort(duelers);
Collections.reverse(duelers);
//for(Duelist element : duelers){
//System.out.println(element.getName());
//System.out.println(element.getChance());
//}
while(duelers.size() > 1){
for(Duelist element : duelers){
System.out.println(element.getName());
System.out.println("Chance:" + element.getChance());
int randomInt = generator.nextInt(element.getChance());
System.out.println("Random int " + randomInt);
//Destroy target if randomInt equals 0
if (randomInt == 0){
//Check to make sure the best duelist is not killing themselves
if (element.equals(duelers.get(duelers.size()-1))){
System.out.println("LASTDUDE");
Duelist bestDueler = duelers.get(duelers.size()-2);
bestDueler.kill();
rank.add(element);
duelers.remove(bestDueler);
}
else {
System.out.println("Killshot");
Duelist bestDueler = duelers.get(duelers.size()-1);
bestDueler.kill();
rank.add(element);
duelers.remove(bestDueler);
}
}
}
}
System.out.println(duelers);
}
}
答案 0 :(得分:3)
for(Duelist element : duelers){
当你进入这个块时,你正在遍历duelers列表,这意味着除非你使用迭代器的ConcurrentModificationException
方法,否则你不能在不引起remove()
的情况下更改列表。
这里的问题是,您无法访问迭代器。因此,您必须使用迭代器将foreach循环更改为while循环:
Iterator<Duelist> it = duelists.iterator();
while(it.hasNext()){
Duelist element = it.next();
// continue as before
(评论后更新) 或更好:
for(Iterator<X> it=x.iterator();it.hasNext();){
Duelist element = it.next();
//continue as before
而不是
duelers.remove(element);
写
// the problem here is: you can only remove the current element,
// so you'll have to re-think some of your code
it.remove();
或者:您可以创建列表的副本以进行迭代。这是浪费内存(和代码味道),但如果你的应用程序很小,它应该没有太大的区别,并且它需要你的重写次数最少。
for(Duelist element : new ArrayList<Duelist>(duelers)){
// continue as above
答案 1 :(得分:1)
您不能在foreach循环中修改集合,而是使用Iterator 当你想删除某些内容时,请使用Iterator.remove():
答案 2 :(得分:0)
问题在于这一行duelers.remove(bestDueler);
当你迭代它而不使用迭代器时,你不应该修改列表
你是for(Duelist element : duelers)
使用迭代器隐含的
明确使用迭代器,即duelers.listIterator()
,并使用remove
代替iterator