将arraylist中的数据编辑为文本文件时出现ConcurrentModificationException

时间:2014-01-25 15:54:01

标签: java swing file arraylist concurrentmodification

private void btnOKActionPerformed(java.awt.event.ActionEvent evt)                                      
    {                                          
        try
        {
            if(txtStaffID.getText(0, 2).equals("AD"))
            {
                for(Admin admin:admincontrolpanel.adminList)
                {
                    if(txtUsername.getText().equals("") || txtPassword.getText().equals("") || txtName.getText().equals("") || txtEmail.getText().equals("") || txtContactNumber.getText().equals("") || txtICNumber.getText().equals(""))
                    {
                        JOptionPane.showMessageDialog(null, "Please fill in the blank", "ERROR", JOptionPane.ERROR_MESSAGE);
                    }
                    else if(txtUsername.getText() != null && txtPassword.getText() != null && txtName.getText() != null && txtEmail.getText() != null && txtContactNumber.getText() != null && txtICNumber.getText() != null)
                    {
                        admin.setId(txtStaffID.getText());
                        admin.setUsername(txtUsername.getText());
                        admin.setPassword(txtPassword.getText());
                        admin.setName(txtName.getText());
                        admin.setEmail(txtEmail.getText());
                        admin.setContactNumber(txtContactNumber.getText());
                        admin.setIcNumber(txtICNumber.getText());
                        Admin newAdmin = new Admin(admin.getId(),admin.getUsername(),admin.getPassword(),admin.getName(),admin.getEmail(),admin.getContactNumber(),admin.getIcNumber());
                        admincontrolpanel.adminList.remove(admin);
                        admincontrolpanel.adminList.add(newAdmin);
                    }
                }
                JOptionPane.showMessageDialog(null, "Successfully Added!", "Add Staff", JOptionPane.PLAIN_MESSAGE);
                dispose();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

在文本文件中获取了这些数据......

AD001|jeff|jeff|jeff|jeff@gmail.com|123456|123456
AD002|admin|admin|admin|admin@gmail.com|123456|123456

当我按下OK按钮到edi ...它向我显示这个ConcurrentModificationException错误....任何人都可以帮我看看它? Admin是类... adminList是arraylist ...

        try
        {
            PrintWriter pw = new PrintWriter("Admin.txt");
            for(Admin admin:admincontrolpanel.adminList)
            {
                pw.println(admin.getId() + "|" + admin.getUsername() + "|" + admin.getPassword() + "|" + admin.getName() + "|" + admin.getEmail() + "|" + admin.getContactNumber() + "|" + admin.getIcNumber());
            }
            pw.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

这是我想从arraylist写入文本文件的代码.... 然后它给了我arraylist中的这种数据...可以编辑它..但删除了第一个数据并添加了一个新数据

AD002|admin|admin|admin|admin@gmail.com|123456|123456
AD002|admin|admin|admin|admin@gmail.com|999|123456

3 个答案:

答案 0 :(得分:0)

通过SO快速搜索会很快向您显示可能的解决方案..您可以使用标准循环并循环直到上一个列表的大小,而不是像您一样使用隐式迭代器:

ArrayList<Admin> = admincontrolpanel.adminList;
int adminListSize = adminList.size(); 
for(int i=0;i<adminListSize;i++) {
   Admin admin = adminList.get(i);

或者您可以使用ListIterator使用迭代器遍历列表并进行修改。

此外,admincontrolpanel不是一个好的变量名。使用camelCase。

答案 1 :(得分:0)

  

for(Admin admin:admincontrolpanel.adminList)

通过此循环,您将迭代adminList(ArrayList)

    Admin newAdmin = new Admin(admin.getId(),admin.getUsername(),admin.getPassword(),admin.getName(),admin.getEmail(),
    admin.getContactNumber(),admin.getIcNumber());
    admincontrolpanel.adminList.remove(admin);
    admincontrolpanel.adminList.add(newAdmin);

上面的最后两行你要删除并添加这里不允许的ArrayList项,因为你已经迭代了ArrayList。你不能在这里同时迭代和修改ArrayList。这就是你面对Concurrent..exception的原因。

答案 2 :(得分:0)

由于另一个线程内的线程可能会发生此问题。例如,如果您在第一个线程中执行某些代码,那么此线程中有另一个线程。然后就会出现这个问题。