我正在用 Java 开发一个图书馆系统。我有一个名为 Things 的类(class),有两个 child :Print 和 Digital。 打印然后分为书籍和期刊。
以下是我编写的用于打印项目的代码片段。完整代码包含导入。
public class Collection
{
private ArrayList <Things> theCollection;
private ListIterator <Things> listItr;
public Collection ()
{
theCollection = new ArrayList <> ();
listItr = theCollection.listIterator ();
}
public void get ()
{
Things sThing;
Book sBook;
Periodical sPeriodical;
Digital sDigital;
sThing = listItr.next ();
if (sThing instanceof Book)
{
sBook = (Book) sThing;
sBook.bookInfo ();
}
else if (sThing instanceof Periodical)
{
sPeriodical = (Periodical) sThing;
sPeriodical.periodicalInfo ();
}
else if (sThing instanceof Digital)
{
sDigital = (Digital) sThing;
sDigital.digitalInfo ();
}
}
public void printAll ()
{
while (listItr.hasNext ())
get ();
}
}
我对 get() 方法中的以下语句有疑问:
sThing = listItr.next ();
当我运行代码时,它给了我一个 ConcurrentModificationException。我试图在网上搜索答案,但他们都建议使用迭代器,我有那个。我哪里做错了?
感谢您的帮助。
最佳答案
问题
您在构造类时直接在创建列表后创建/请求迭代器。此时列表将为空。
我假设您之后会在该列表中添加/删除元素。这是一个并发修改,因为迭代器限制迭代在其创建后发生在未修改的列表上。对迭代器的下一次调用将抛出此异常。
解决方案
不要在类的构造函数中创建迭代器。在需要的时候创建它:
public class Collection {
private ArrayList <Things> theCollection;
public Collection () {
theCollection = new ArrayList <> ();
}
public void get () {
...
ListIterator <Things> listItr = theCollection.listIterator();
sThing = listItr.next ();
...
}
}
关于java - 即使使用 ListIterator,ConcurrentModificationException 仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30724272/