Java. Util. Concurrentmodificationexception Problem

On this code I get an java.util.ConcurrentModificationException the method is in a webservice and first reads the file and checks if the vakNaam is in the file. Then it will be removed and the file will be rewritten. The exception is thrown by Exception2 (in the println)

        @WebMethod
        public boolean removeVak(String naam){
    ArrayList<String> tempFile = new ArrayList<String>();

    //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;
}
2

2 Answers

The error is in this part:

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

Don't modify the list you are iterating over. You could solve this by using the Iterator explicitely:

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

The Java 5 enhanced for loop uses an Iterator underneath. So When you remove from tempFile the fail fast nature kicks in and throws the Concurrent exception. Use an iterator and call its remove method, which will remove from the underlying Collection.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Alexander Ross

Alexander Ross

Gaming, Esports & Interactive Media Writer

Alexander Ross has covered the video game industry for a decade, writing deep dives on game design, esports tournaments, VR developments, and gaming culture.

Share this article
Twitter Facebook Pinterest