Pessoal estou tentando remover um obj de um colecao, mas ele esta dando erro, estou tentando assim: for(Object obj : coll){
Permissao per = (Permissao)obj;
if (per.getAtivo() == 0){
coll.remove(per);
}
}
assim que ele remove um obj ele gerar esse error:Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
at br.com.maringa.compGerusa.login.Login.retitarPermissaoInativa(Login.java:65)
at br.com.maringa.compGerusa.login.Login.logar(Login.java:54)
at TesteLogin.main(TesteLogin.java:13)
como faço para remover esse obj sem dar erro?
Remover item de uma colecao?
3 Respostas
bom, eu acredito nao ser possivel remover um elemento no momento da utlizização. Assim tente:
no código que vc mostrou
Permissao per = new Permissao();
per.setAtivo(0);
coll.remove(per)
na classe Permissao
public boolean equals(Object obj){
Permissao p = (Permissao)obj;
if( this.ativo == p.ativo ){
return true;
}
else{
return false;
}
}
assim no metodo equals vc define que uma permissao vai ser igual a outra quando o campo ativo assim for…
Olá,
O enhanced for para Collections é um atalho para um for usando Iterator. Ou seja, o seu loop ficaria mais ou menos assim:
Iterator i = coll.iterator();
while( i.hasNext() ) {
Object obj = i.next();
Permissao per = (Permissao)obj;
if (per.getAtivo() == 0){
coll.remove(per); // Esta linha causaria exceção
}
}
Como você pode ver aqui, o Iterator não permite uma alteração da Collection enquanto se itera sobre ela.
Uma solução rápida e “suja” pro seu problema seria:
for( int i = 0; i < coll.size(); i++ ) {
Object obj = coll.get(i);
Permissao per = (Permissao)obj;
if (per.getAtivo() == 0){
coll.remove(per);
i--; // Esta linha é necessária, para evitar um IndexOutOfBoundsException
}
}
A linha i– é necessária, pois quando você remove um elemento, o tamanho da lista e as posições dos elementos nela se alteram.
e isso, seria mais sujo ?
ter uma segunda collection, de itens ativos…e no laco, verificar se a permissao e ativa, se for, inclui na collection de itens ativos…
aorocha, vc esta usando o sdk 5, certo ?
tente usar generics… seu codigo vai ficar mais limpo…e adeus casts !!!