Java 另一个ConcurrentModificationException

Java 另一个ConcurrentModificationException,java,Java,我不熟悉Java,尤其是遍历列表和修改其元素。我问了几十个类似的问题,但经过多次尝试后,什么都没用。 在下面的代码示例中,将引发异常。它与并发线程无关,因为我只有一个线程。Netbeans输出表明异常发生在第5行(CustomerData customer=i.next();): CustomerData tempcuster=new CustomerData(“”,tagID,0); tempCustomer.setName(name); tempCustomer.setSize(大小); f

我不熟悉Java,尤其是遍历列表和修改其元素。我问了几十个类似的问题,但经过多次尝试后,什么都没用。 在下面的代码示例中,将引发异常。它与并发线程无关,因为我只有一个线程。Netbeans输出表明异常发生在第5行(CustomerData customer=i.next();):

CustomerData tempcuster=new CustomerData(“”,tagID,0);
tempCustomer.setName(name);
tempCustomer.setSize(大小);
for(ListIterator i=customers.ListIterator();i.hasNext();)
{
CustomerData customer=i.next();
if(customer.getTagID().contains(tagID))
{
对象[]选项={“覆盖”、“不覆盖”};
int n=JOptionPane.showOptionDialog(根窗格,
“TagID已存在。是否覆盖?”,
"?", 
JOptionPane.YES\u NO\u选项,
JOptionPane.QUESTION\u消息,
无效的
选项,
根窗格);
if(n==JOptionPane.YES\u选项){
i、 设置(临时客户);
}
}
否则{
addCustomer();
}
}

整个代码只检查元素是否有匹配的tagID,如果有,则替换其中的两个值(name和size)。起初,我试图在元素的for循环中使用
setName()
setSize()
,但在它不起作用之后,在阅读了其他相关问题之后,我将值分配给循环之前的临时对象,并使用迭代器的set方法替换当前元素。但仍然没有成功,甚至似乎永远也不会成功,因为异常出现在第5行之后…

ConcurentModificationException并不总是表示对象已被其他线程并发修改

在您的情况下,问题可能在于以下方面(通过addCustomer方法猜测):您正在获取集合的迭代器,然后修改此集合。因为集合被修改,迭代器变得无效并引发异常


我的建议是创建temproray客户列表,当迭代完成时,您会将其附加到原始客户列表中。

问题可能是这一行:

        addCustomer();

试图在修改代码时修改<代码>客户>代码>。这是不允许的

不管怎么说,这似乎是一个逻辑错误:如果没有客户具有正确的
tagID
,那么在循环结束后,您可能只想调用
addCustomer
,但是您当前的代码尝试为每个具有错误
tagID
的客户调用
addCustomer
。因此,您需要在循环过程中使用
布尔
变量来跟踪是否有任何客户匹配,然后在循环结束后,根据需要调用
addCustomer

如中所述:

如果线程在其上迭代时直接修改集合 如果集合具有fail fast迭代器,迭代器将抛出 例外


我猜它是在调用
addCustomer()
修改
customers
对象之后发生的。您可以将新添加的对象保留在不同的集合中,直到循环结束,也可以中断循环并在添加后重新启动

啊!!你是对的。我一直在看if部分,而不是函数的else部分。现在我将
addCustomer()
替换为
I.add
,它可以工作了。。。重新审视代码会创造奇迹。另外,NetBeans告诉我异常发生在第5行,这让我很困惑。我猜整个if-else语句都算错了。这三个答案都是正确的,我在提问前读到的答案也是正确的。我会用逻辑错误标记你的建议是正确的。我下一步会继续。谢谢大家!
        addCustomer();