假设我们有一个Pencil类,它有两个这样的属性:
public class Pencil {
String color;
int length;
public Pencil(String c, int sh, int l) {
this.color = c;
this.length = l;
}
public String getColor() {
return color;
}
}
然后我们将4个铅笔的对象放入一个盒子中:
public class Box {
ArrayList<Pencil> list;
public Box() {
list = new ArrayList<Pencil>();
list.add(new Pencil("blue", 5, 10));
list.add(new Pencil("black", 5, 10));
list.add(new Pencil("brown", 5, 10));
list.add(new Pencil("orange", 5, 10));
}
}
然后我们想要根据color
的值从列表中删除其中一个对象:
public class TestDrive {
public static void main(String[] args) {
Box b = new Box();
ArrayList box = b.list;
Iterator it = box.iterator();
while(it.hasNext()) {
Pencil p = (Pencil) it.next();
if (p.getColor() == "black") {
box.remove(p);
}
}
}
}
看起来很简单,但我得到了Exception in thread "main" java.util.ConcurrentModificationException
。如果有人能说出我在这里缺少的东西,我会很感激
答案 0 :(得分:3)
你有两个问题。
第一个问题 - 您获得ConcurrentModificationException
的原因 - 是因为您使用列表删除元素,而不是迭代器
您必须使用it.remove()
删除您当前所在的元素。
接下来,您要将字符串与==
进行比较 - 这并不能保证完全正常工作。您应该使用.equals
代替。
撤消您比较它们的顺序,这样您就不会有机会获得NullPointerException
。
这里是块的样子,重新访问。
public static void main(String[] args) {
Box b = new Box();
ArrayList<Pencil> box = b.list;
for(Iterator<Pencil> it = box.iterator(); it.hasNext();) {
Pencil p = it.next();
if ("black".equals(p.getColor())) {
it.remove();
}
}
}
答案 1 :(得分:2)
致电it.remove()
而非box.remove(p)
。