我是 Java 新手,尤其是迭代列表和修改其元素。我遇到了几十个类似的问题,但经过多次尝试都没有效果。 在下面的代码示例中,抛出了异常。它与并发线程无关,因为我只有一个线程。 Netbeans 输出显示异常发生在第 5 行(CustomerData customer = i.next();):
CustomerData tempCustomer = new CustomerData("",tagID,0);
tempCustomer.setName(name);
tempCustomer.setSize(size);
for(ListIterator<CustomerData> i = customers.listIterator(); i.hasNext(); )
{
CustomerData customer = i.next();
if(customer.getTagID().contains(tagID))
{
Object[] options = {"overwrite", "do not overwrite"};
int n = JOptionPane.showOptionDialog(rootPane,
"TagID already exists. overwrite?",
"?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
rootPane);
if ( n == JOptionPane.YES_OPTION ){
i.set(tempCustomer);
}
}
else{
addCustomer();
}
}
整个代码只应该检查元素是否具有匹配的 tagID,如果有,则替换其中的两个值(名称和大小)。最初我尝试在元素的 for 循环内使用 setName()
和 setSize()
,但是在它不起作用并且阅读其他相关问题后,我分配了循环之前临时对象的值,并使用迭代器的 set 方法来替换当前元素。但仍然没有成功,甚至似乎永远不会走那么远,因为异常出现在第 5 行之后......
最佳答案
问题大概出在这一行:
addCustomer();
正在尝试修改customers
,而您正在迭代它。这是不允许的。
无论如何,这似乎是一个逻辑错误:假设您只想在循环之后调用 addCustomer
一次,如果没有客户拥有正确的 tagID
,但您当前的代码尝试为 每个 tagID
客户调用 addCustomer
。因此,您需要在循环期间使用 boolean
变量来跟踪是否有任何客户匹配,然后在循环结束后,在适当的情况下调用 addCustomer
。
关于java - 另一个并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812850/