我在Java上做一个图书馆系统。我有一个名为 Things 的班级,有两个孩子:打印和数字。然后将打印分为图书和期刊。
以下是我为打印项目编写的代码片段。完整的代码有导入。
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。我尝试在线搜索答案,但他们都建议使用迭代器,我就有了。我哪里做错了?
感谢您的帮助。
答案 0 :(得分:4)
问题
在构建类时,您可以在创建列表后直接创建/请求迭代器。此时列表将为空。
我假设你之后在该列表中添加/删除元素。这是并发修改,因为迭代器限制迭代在创建后在未修改的列表上发生。然后对迭代器的下一次调用将抛出此异常。
解决方案
不要在类的构造函数中创建迭代器。在需要的时间创建它:
public class Collection {
private ArrayList <Things> theCollection;
public Collection () {
theCollection = new ArrayList <> ();
}
public void get () {
...
ListIterator <Things> listItr = theCollection.listIterator();
sThing = listItr.next ();
...
}
}
答案 1 :(得分:3)