2015-01-31 2 views
0

Ну, я уже прочитал другие сообщения и не могу решить свою проблему. У меня есть привязка dataTable (JSF) в моем ManagedBean. У меня есть список выбранных элементов и я хочу удалить эти элементы, см: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

Я пытался отредактировать метод deletear(), поставив итератор для удаления элемента, но не работал, ошибка продолжается.

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(); 
+0

Это не относится к JSF в любом случае. Это Java SE. Вы не можете удалить элементы коллекции, итерации по этой коллекции. Функциональность включена вместо метода удаления итератора. В этом случае вы должны использовать метод удаления итератора. – Tiny

+0

"* Обратите внимание, что Iterator.remove является единственным безопасным способом изменения коллекции во время итерации, поведение неуказано, если базовая коллекция модифицируется каким-либо другим способом, пока выполняется итерация. *" Http://docs.oracle .com/javase/tutorial/collections/interfaces/collection.html – Tiny

ответ

3

Вы утверждаете,

Well, i already read the others posts and can't solve my problem.

Если вы читали другие подобные сообщения, то вы уже должны знать, что вы можете удалить только с итератор, что-то вы не делаете, и это именно то, что вы должны делать.

например,

public void deltar(Iterator<Bean> it, Bean bean) { 
    // ..... 
    it.remove(); 
} 
+0

Но мне нужно удалить этот элемент из моего списка, как я могу это решить? – Shelly

+0

@ user2776409: используйте Итератор, чтобы перебирать список, конечно. –

+0

Итак, внутри метода «deletear()» вместо этого используйте «beans.remove (b)« я должен сделать еще один beans.iterator и удалить элемент? это верно ? – Shelly

Смежные вопросы