以下是Java中的错误代码。
package wrapper;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
final public class Main
{
public static void main(String... args)
{
List<String>list=new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String>it=list.iterator();
while(it.hasNext())
{
String item=it.next();
if(item.equals("B"))
{
list.remove(item);
}
System.out.println(item);
}
ListIterator<String>listIterator=list.listIterator();
listIterator.set("D"); //Throws java.lang.IllegalStateException
listIterator.add("D");
System.out.print("\n\n");
for(Object o:list)
{
System.out.println(o);
if(o.equals("C"))
{
listIterator.remove(); //Throws java.lang.IllegalStateException
}
}
}
}
在处理 EJB 中的实体或其他情况时,使用List
,Collection
,Set
等非常常见。有时在创建相应的迭代器之后修改它们时,它们会抛出java.lang.CurrentModificationException
,这是非常关键的避免。
在上面的代码中,我无法在创建Iterator it
后添加或删除元素。这样做会引发java.lang.CurrentModificationException
。如何有效地避免它?
接下来,我使用名为 listIterator 的ListIterator<String>
,它会抛出相应的异常,如上面的注释代码所示。我们如何避免它们并添加&amp;分别使用add()和set()方法有效地设置元素?
此外,通过语句listIterator
向listIterator.add("D");
添加元素会在列表顶部显示元素。为什么呢?
答案 0 :(得分:3)
您将收到ConcurrentModificationException,因为您在尝试迭代它时正在修改基础集合。您无法在remove
上使用迭代器的循环内的list
上调用list
。
但是,Iterator接口提供了一个可选的remove
方法,可用于从您正在迭代的列表中删除项目。在循环中调用it.remove();
将删除迭代器返回的最后一个元素。
同样适用于ListIterator。
至于为什么add方法把东西放在“列表的顶部”,请查看documentation。发生的事情是新元素被直接放在下一次调用next
时返回的元素前面的基础列表中。因此,在循环的下一次迭代中,当您调用next
时,您将获得刚刚插入的元素。