gpt4 book ai didi

java - 枚举抛出 concurrentModification 异常。为什么?

转载 作者:行者123 更新时间:2023-11-29 04:29:30 24 4
gpt4 key购买 nike

枚举是故障安全的。故障安全迭代器将用于原始集合的克隆。那为什么它会抛出 concurrentModificationException?请澄清。

请找到我的代码:

public static void main(String[] args) {

Vector<String> v=new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");

Enumeration en=(Enumeration) Collections.enumeration(v);

while(en.hasMoreElements())
{
String value=(String) en.nextElement();
System.out.println(value);
v.remove(value);//modifying the collection

}

}

找到下面的错误信息

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.Vector$Itr.checkForComodification(Unknown Source)
at java.util.Vector$Itr.next(Unknown Source)
at java.util.Collections$2.nextElement(Unknown Source)
at valar.org.src.EnumerationTest.main(EnumerationTest.java:24)

最佳答案

Collections.enumeration(Collection) 将从作为参数传递的集合创建一个迭代器:

public static <T> Enumeration<T> enumeration(final Collection<T> c) {
return new Enumeration<T>() {
private final Iterator<T> i = c.iterator();

public boolean hasMoreElements() {
return i.hasNext();
}

public T nextElement() {
return i.next();
}
};
}

这意味着迭代器返回到您在迭代器循环中删除元素的集合,并且您无法删除您使用迭代器迭代的集合中的元素。

您应该创建您在 enumeration() 调用中传递的 Vector 的副本:

Enumeration<String> en = Collections.enumeration(new Vector<String>(v));

作为旁注,您应该更喜欢 List 接口(interface)和 ArrayList 实现而不是 Vector(同步的)并声明泛型集合备用转换并提高代码的类型安全性。

所以它会给出这段代码(我保留了 Vector 的使用,因为它可能是一个不可修改的约束,但我指定了泛型,因为即使在遗留代码中添加它通常也更简单):

Vector<String> v = new Vector<String>();
v.add("Amit");
v.add("Raj");
v.add("Pathak");
v.add("Sumit");
v.add("Aron");
v.add("Trek");

Enumeration<String> en = Collections.enumeration(new Vector<String>(v));

while (en.hasMoreElements()) {
String value = (String) en.nextElement();
System.out.println(value);
v.remove(value);// modifying the collection
}

关于java - 枚举抛出 concurrentModification 异常。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44366342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com