我正在尝试使用App Engine和objectify删除数据库中的某些文件。这是我有例外的代码:
for(SottoCategoria sc: lsc){
List<Key<Dispensa>> ld2=sc.getDispense();
if(ld2!=null){
for(Key<Dispensa> kd : ld2){ // <---- Exception!!
if(kd.equals(k)){
sc.removeDispensa(k);
ofy().save().entity(sc).now();
break;
}
}
}
}
这是从列表中删除的方法:
public void removeDispensa(Key<Dispensa> k ){
Iterator<Key<Dispensa>> kIter = dispense.iterator();
while(kIter.hasNext()) {
Key<Dispensa> kk = kIter.next();
System.out.println(kk.equals(k));
if(kk.equals(k)){
kIter.remove();
break;
}
}
}
我该如何解决?谢谢!
编辑:
我决定在循环中插入一个简单的中断,因为在Sottocategoria中只能是我要删除的一个分区!
答案 0 :(得分:2)
发生ConcurrentModificationException是因为您在迭代它时尝试删除列表的一部分。尝试使用带索引的for循环或创建迭代器。
示例for-loop:
for(int i = 0; i<dispense.size();i++) {
System.out.println(dispense.get(i).equals(k));
if(dispense.get(i).equals(k)){
dispense.remove(i);
break;
}
}
示例迭代器:
Iterator<Key<Dispensa>> It = dispense.iterator();
while(It.hasNext()) {
Key<Dispensa> kk = It.next();
System.out.println(kk.equals(k));
if(kk.equals(k)){
dispense.remove(kk);
break;
}
}
答案 1 :(得分:2)
迭代器更适合这种用例。
以下是一个例子:
public void removeDispensa(Key<Dispensa> k ){
Iterator<Dispensa> kIter = k.iterator();
while(kIter.hasNext()) {
Dispensa kk = kIter.next();
System.out.println(kk.equals(k));
if(kk.equals(k)){
kIter.remove();
}
}
}
答案 2 :(得分:1)
尝试使用List.iterator()
来避免此异常。
ConcurrentModificationException - 当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。当您使用迭代器时,这不会发生。使用迭代器迭代集合是遍历集合的最安全,最快捷的方法
答案 3 :(得分:1)
您无法修改正在迭代的列表。
答案 4 :(得分:0)
你的问题是因为你正在尝试修改你正在阅读的同一个数组,所以为了避免这个问题你必须复制你的数组并迭代重复的数组并在好的数组中进行操作。
告诉我你是否需要一些关于代码的帮助