problema java.util.ConcurrentModificationException

Neste código eu recebo um java.util.ConcurrentModificationException o método está em um webservice e primeiro lê o arquivo e verifica se o vakNaam está no arquivo. Em seguida, ele será removido e o arquivo será reescrito. A exceção é lançada por Exception2 (no println)

@WebMethod public boolean removeVak(String naam){ ArrayList tempFile = new ArrayList(); //Read the lines boolean found = false; BufferedReader br = null; try { br = new BufferedReader(new FileReader("C:/vak.txt")); String strLine; while ((strLine = br.readLine()) != null){ tempFile.add(strLine); } }catch(Exception e){ System.out.println("Exception " + e); }finally { try { if (br != null) br.close(); } catch (Exception ex) { ex.printStackTrace(); } } //Write the lines BufferedWriter out= null; try{ for(String s : tempFile){ String [] splitted = s.split(" "); if(splitted[0].equals(naam)){ tempFile.remove(s); found = true; } } out = new BufferedWriter(new FileWriter("C:/vak.txt", false)); for(String s: tempFile){ out.newLine(); out.write(s); } out.close(); } catch (Exception e) { System.out.println("Exception2 " + e); return false; }finally { try { if (out != null) out.close(); } catch (Exception ex) { ex.printStackTrace(); } } return found; } 

O erro está nesta parte:

 for(String s : tempFile){ String [] splitted = s.split(" "); if(splitted[0].equals(naam)){ tempFile.remove(s); found = true; } } 

Não modifique a lista que você está repetindo. Você poderia resolver isso usando o Iterator explicitamente:

 for(Iterator it = tempFile.iterator; it.hasNext();){ String s = it.next(); String [] splitted = s.split(" "); if(splitted[0].equals(naam)){ it.remove(); found = true; } } 

O laço aprimorado para Java 5 usa um Iterador embaixo. Então, quando você remove tempFile, a natureza fail fast entra em ação e lança a exceção Concurrent. Use um iterador e chame seu método remove, que será removido da coleção subjacente.