Search code examples
javaspring-mvciteratorconcurrentmodification

Getting java.util.ConcurrentModificationException in Iterator


I am trying to iterate custom object using iterator and adding data into that custom object but when size of object is 1 it's working but when I am adding second data it gives me an error : nested exception is java.util.ConcurrentModificationException

My Code is as Follow :

public List<ValidationObject> _validationObjects = new ArrayList<>();

    public void addError(String key, String value){
        int size = _validationObjects.size();
        if(size==0){
            ValidationObject vo = new ValidationObject();
            vo.setKey(key);
            vo.addLine(value);
            _validationObjects.add(vo);
        }
        else{
            Iterator i = _validationObjects.iterator();
            while(i.hasNext()){
                ValidationObject obj = (ValidationObject)i.next();
                if(obj.getKey().equals(key)){
                    obj.addLine(value);
                }else{
                    ValidationObject vo = new ValidationObject();
                    vo.setKey(key);
                    vo.addLine(value);
                    _validationObjects.add(vo);
                }
            }
        }
    }

In class ValidatioObject I have variable as follow :

private List<String> _lines;
private String _key;

I am calling addError() method as follow :

list.addError("Name", "Should not empty");
list.addError("Prefix", "Should not empty");

Any Help on it, why it's behaving like this.


Solution

  • I think you need to change the logic. Add to your list outside the iterator

    else{
                    boolean keyFound = false;
                    Iterator i = _validationObjects.iterator();
                    while(i.hasNext()){
                        ValidationObject obj = (ValidationObject)i.next();
                        if(obj.getKey().equals(key)){
                            obj.addLine(value);
                            keyFound = true;
                        }
                    }
                    if(!keyFound){
                            ValidationObject vo = new ValidationObject();
                            vo.setKey(key);
                            vo.addLine(value);
                            _validationObjects.add(vo);
                    }
                }