java - 另一个并发修改异常

标签 java

我是 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/

相关文章:

java - 连接数据库时出现异常

java - 如何从概念上计算服务器可以服务的最大并发请求/负载?

java - 在 Struts2 中提交响应后无法调用 sendRedirect()

java - 如何从本地Maven存储库提供Antlr目标?

java - 源文件夹和(普通)文件夹有什么区别

java - 如何在后台运行matlab?

java - 语法分析题

java - 什么是固定对象溢出?

java - 如何在不使用正则表达式的情况下解析操作数和运算符的数学表达式并解决它?

java - 在Android中调用一个变量的Intent