在Iterator中获取java.util.ConcurrentModificationException

时间:2014-03-22 07:41:29

标签: java spring-mvc iterator concurrentmodification

我正在尝试使用迭代器迭代自定义对象并将数据添加到该自定义对象中,但是当对象的大小为1时它正在工作但是当我添加第二个数据时它会给我一个错误:nested exception is java.util.ConcurrentModificationException

我的代码如下:

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);
                }
            }
        }
    }

在ValidatioObject类中,我有如下变量:

private List<String> _lines;
private String _key;

我调用addError()方法如下:

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

任何有关它的帮助,为什么它的行为都是这样的。

2 个答案:

答案 0 :(得分:3)

我认为你需要改变逻辑。添加到迭代器之外的列表

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);
                }
            }

答案 1 :(得分:1)

为什么这个例外是因为这一行,

_validationObjects.add(vo);

怎么一回事,因为,

如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。

所以尝试仅使用迭代器实例添加它。

定义一个ListIterator并添加到其中,

ListIterator i=_validationObjects.listIterator();
i.add(vo);