Java BO中的ConcurrentModificationException
我在这段代码中遇到了一个java.util.ConcurrentModificationException,似乎无法理解原因,也无法修复它 在BO中,我有这个(特权是BO中的arraylist)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(
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();
如果(