我正在尝试制作一个漂浮在屏幕上的小行星对象的小程序。如果两颗小行星碰撞,那么速度较慢的小行星应该分解成两颗较小的小行星。一旦小行星的大小为1,它就会消失。
当我尝试比较两个小行星时,我得到一个ConcurrentModificationException,我不知道为什么。
private volatile Collection<Asteroid> belt;
private void handleCollisions() {
Collection<Asteroid> psuedoBelt = belt;
Iterator<Asteroid> one;
Iterator<Asteroid> two;
for (one = psuedoBelt.iterator(); one.hasNext();) {
Asteroid aOne = one.next();
for (two = psuedoBelt.iterator(); two.hasNext();) {
Asteroid aTwo = two.next();
if (aOne.collidesWith(aTwo)) {
if (aOne.getSpeed() > aTwo.getSpeed()) {
Collection<Asteroid> split = aTwo.split();
two.remove();
for (Iterator<Asteroid> three = split.iterator(); three
.hasNext();) {
psuedoBelt.add(three.next());
}
} else {
Collection<Asteroid> split = aOne.split();
one.remove();
for (Iterator<Asteroid> three = split.iterator(); three
.hasNext();) {
psuedoBelt.add(three.next());
}
}
}
}
}
belt = psuedoBelt;
}
答案 0 :(得分:1)
首先,创建一个迭代器:
for (one = psuedoBelt.iterator(); one.hasNext();) {
然后,第二个,在同一个集合上:
for (two = psuedoBelt.iterator(); two.hasNext();) {
然后,使用第二个迭代器删除项目:
two.remove();
问题是,当您从集合中删除该项时,第一个迭代器(one
)不知道此删除。
因此,在one.next()
上,它检测到集合已被修改并引发此异常。
有两种解决方案: