尝试从列表中删除元素时出现ConcurrentModificationException
问题描述:
嗯,我已经阅读了其他帖子,无法解决我的问题。我的ManagedBean中有一个dataTable(JSF)绑定。我有选择的要素的列表,我想删除这个元素,请参阅:尝试从列表中删除元素时出现ConcurrentModificationException
public void removeSelected() {
for (Map.Entry<Integer, Boolean> entry : registrosSelecionados.entrySet()){
if (entry.getValue() == true){
int id = entry.getKey();
Iterator<Bean> it = beans.iterator();
while(it.hasNext()){
Bean b = it.next();
if (b.getId().equals(id)){
setBean(b);
deletar();
}
}
}
}
}
我上面调用另一个名为法“deletar()”方法,请参阅:
public void deletar() {
try {
//Se o bean for nulo então capturamos o bean selecionado no DataTable, se este existir
if (bean == null){
if (dataTable == null){
throw new RuntimeException("O bean é nulo e não há dataTable vinculado ao ManagedBean. A deleção será abortada");
}
bean = (Bean) dataTable.getRowData();
}
beforeRemove();
getBoPadrao().delete((AbstractBean) bean);
addInfoMessage("Registro deletado com sucesso");
beans.remove(bean);
bean = null;
afterRemove();
} catch (BOException e) {
addErrorMessage(e.getMessage());
FacesContext.getCurrentInstance().validationFailed();
} catch (Exception e) {
e.printStackTrace();
logger.error((new StringBuilder()).append("Erro ao deletar: ")
.append(e.getMessage()).toString());
FacesContext.getCurrentInstance().validationFailed();
addErrorMessage((new StringBuilder()).append("Erro ao deletar. ")
.append(e.getMessage()).toString());
}
}
的豆是从删除数据库但当尝试从“目录”中删除我得到错误:
Jan 31, 2015 5:38:32 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
Grave: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at br.com.jwebbuild.mb.BasicCrudMBImpl.removeSelected(BasicCrudMBImpl.java:226)
编辑1
我试着编辑我的deletar()方法把一个迭代器删除元素,但没有工作,错误继续。
public void deletar() {
try {
//Se o bean for nulo então capturamos o bean selecionado no DataTable, se este existir
if (bean == null){
if (dataTable == null){
throw new RuntimeException("O bean é nulo e não há dataTable vinculado ao ManagedBean. A deleção será abortada");
}
bean = (Bean) dataTable.getRowData();
}
beforeRemove();
getBoPadrao().delete((AbstractBean) bean);
addInfoMessage("Registro deletado com sucesso");
Iterator<Bean> it = beans.iterator();
while (it.hasNext()) {
Bean b = it.next();
if (b.equals(bean)) {
it.remove();
}
}
bean = null;
afterRemove();
答
幽州,
Well, i already read the others posts and can't solve my problem.
如果你读过其他类似的职位,那么你应该已经知道了,你只能用删除迭代,东西你不这样做,这正是你必须做的。
例如,
public void deltar(Iterator<Bean> it, Bean bean) {
// .....
it.remove();
}
这是不相关的JSF反正。它是Java SE。迭代该集合时,无法删除集合的元素。相反,该功能是通过迭代器的删除方法合并的。正如答案所示,你应该在这种情况下使用迭代器的删除方法。 – Tiny 2015-02-01 04:12:43
“*请注意,Iterator.remove是在迭代过程中修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为未指定*”http://docs.oracle.com .com/javase/tutorial/collections/interfaces/collection.html – Tiny 2015-02-01 04:13:56