Java BO中的ConcurrentModificationException

Java BO中的ConcurrentModificationException,java,exception,Java,Exception,我在这段代码中遇到了一个java.util.ConcurrentModificationException,似乎无法理解原因,也无法修复它 在BO中,我有这个(特权是BO中的arraylist) public void setPrivilegename(字符串privilegename){ this.privileges.add(privilegeneame); } List arraylist=新建arraylist();如果(rs!=null){ while(rs.next()){ for(

我在这段代码中遇到了一个java.util.ConcurrentModificationException,似乎无法理解原因,也无法修复它

在BO中,我有这个(特权是BO中的arraylist)

public void setPrivilegename(字符串privilegename){
this.privileges.add(privilegeneame);
}
List arraylist=新建arraylist();如果(rs!=null){
while(rs.next()){
for(BO-BO:arraylist){
如果(bo.getRolepkey()==rs.getInt(“ROLE_PKEY”){
bo.setPrivilegename(rs.getString(“SP.NAME”);
}否则{
BO newobj=新BO();
newobj.setroleprivilegypkey(rs.getInt(“特权”);
newobj.setProticolpkey(协议);
newobj.setPrivilegename(rs.getString(“SP.NAME”);
newobj.setRolepkey(rs.getInt(“SRP.ROLE_PKEY”);
arraylist.add(newobj);
}
}
}
}

您不能在使用foreach的同时迭代
ArrayList
并向其中添加元素

使用迭代器,如下所示:

Iterator<PrivilegeObjectBO> iterator = arraylist.iterator();
while (iterator.hasNext()) {
  ...
}
Iterator Iterator=arraylist.Iterator();
while(iterator.hasNext()){
...
}

您不能在使用foreach的同时迭代
ArrayList
并向其中添加元素

使用迭代器,如下所示:

Iterator<PrivilegeObjectBO> iterator = arraylist.iterator();
while (iterator.hasNext()) {
  ...
}
Iterator Iterator=arraylist.Iterator();
while(iterator.hasNext()){
...
}
根据

此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何时候进行了结构修改 创建迭代器后的时间,以任何方式,除了通过 迭代器自己的remove或add方法,迭代器将抛出 ConcurrentModificationException

上面为每个循环获取列表的迭代器,并

  arraylist.add(newobj);
您试图在不使用迭代器自己的方法的情况下修改列表,这将导致
ConcurrentModificationException

这是。

根据

此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何时候进行了结构修改 创建迭代器后的时间,以任何方式,除了通过 迭代器自己的remove或add方法,迭代器将抛出 ConcurrentModificationException

上面为每个循环获取列表的迭代器,并

  arraylist.add(newobj);
您试图在不使用迭代器自己的方法的情况下修改列表,这将导致
ConcurrentModificationException


这是。

在java中,当您在集合上迭代时修改集合时,总是会得到ConcurrentModificationException


可能的解决方案:对添加或删除的项目使用临时集合,并在迭代完成后添加或删除这些项目。

在java中,当您在迭代集合时修改集合时,总是会得到ConcurrentModificationException


可能的解决方案:对添加或删除的项目使用临时集合,并在迭代完成后添加或删除这些项目。

也许您可以查看集合。synchronizedList(List)静态方法。 它应该从给定的列表对象返回一个线程安全的
List
,并且您不应该再得到异常。


否则,您可以尝试(如果适用)通过在方法声明中添加关键字
synchronized
来设置访问同步列表的方法。

也许您可以查看
Collections.synchronizedList(list)
静态方法。 它应该从给定的列表对象返回一个线程安全的
List
,并且您不应该再得到异常。


否则,您可以尝试(如果适用)通过在方法声明中添加关键字
synchronized
,将访问列表的方法设置为synchronized。

其他人已经指出,
add
-ing在对
数组列表进行迭代时是不允许的

但无论如何,要解决您的问题,您似乎需要在尝试
向其添加
之前对整个列表进行迭代,因为您的循环似乎在检查列表中的任何内容是否与您的行匹配,以避免重复。在这种情况下,您不希望在遍历列表时将其添加到列表中,因为直到最后才知道列表是否有重复项

因此,只需迭代并检查是否找到匹配项:

List<PrivilegeObjectBO> arraylist = new ArrayList<PrivilegeObjectBO>();
if (rs != null) {
    while (rs.next()) {

        boolean found = false;
        for (BO bo : arraylist) {
             if (bo.getRolepkey() == rs.getInt("ROLE_PKEY")) {      
                 bo.setPrivilegename(rs.getString("SP.NAME"));
                 found = true;
             }
        }

        if (!found) {
            BO newobj = new BO();
            newobj.setRolepriviledgepkey(rs.getInt("PRIVILEGE_PKEY"));
            newobj.setProticolpkey(protocol);                
            newobj.setPrivilegename(rs.getString("SP.NAME"));
            newobj.setRolepkey(rs.getInt("SRP.ROLE_PKEY"));
            arraylist.add(newobj);
        }
    }
}
List arraylist=new arraylist();
如果(rs!=null){
while(rs.next()){
布尔值=false;
for(BO-BO:arraylist){
如果(bo.getRolepkey()==rs.getInt(“ROLE_PKEY”){
bo.setPrivilegename(rs.getString(“SP.NAME”);
发现=真;
}
}
如果(!找到){
BO newobj=新BO();
newobj.setroleprivilegypkey(rs.getInt(“特权”);
newobj.setProticolpkey(协议);
newobj.setPrivilegename(rs.getString(“SP.NAME”);
newobj.setRolepkey(rs.getInt(“SRP.ROLE_PKEY”);
arraylist.add(newobj);
}
}
}

除非您确实想为列表中已存在的每个不匹配的
BO
添加一个新的
BO

其他人已经指出,
add
-ing在对
数组列表进行迭代时是不允许的

但无论如何,要解决您的问题,您似乎需要在尝试
向其添加
之前对整个列表进行迭代,因为您的循环似乎在检查列表中的任何内容是否与您的行匹配,以避免重复。在这种情况下,您不希望在遍历列表时将其添加到列表中,因为直到最后才知道列表是否有重复项

因此,只需迭代并检查是否找到匹配项:

List<PrivilegeObjectBO> arraylist = new ArrayList<PrivilegeObjectBO>();
if (rs != null) {
    while (rs.next()) {

        boolean found = false;
        for (BO bo : arraylist) {
             if (bo.getRolepkey() == rs.getInt("ROLE_PKEY")) {      
                 bo.setPrivilegename(rs.getString("SP.NAME"));
                 found = true;
             }
        }

        if (!found) {
            BO newobj = new BO();
            newobj.setRolepriviledgepkey(rs.getInt("PRIVILEGE_PKEY"));
            newobj.setProticolpkey(protocol);                
            newobj.setPrivilegename(rs.getString("SP.NAME"));
            newobj.setRolepkey(rs.getInt("SRP.ROLE_PKEY"));
            arraylist.add(newobj);
        }
    }
}
List arraylist=new arraylist();
如果(