【问题标题】:Getting java.util.ConcurrentModificationException in Iterator在迭代器中获取 java.util.ConcurrentModificationException
【发布时间】:2014-03-22 07:41:28
【问题描述】:

我正在尝试使用迭代器迭代自定义对象并将数据添加到该自定义对象中,但是当对象的大小为 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");

关于它的任何帮助,为什么它会这样。

【问题讨论】:

    标签: java spring-mvc iterator concurrentmodification


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      为什么这个异常是因为这一行,

      _validationObjects.add(vo);
      

      因为,

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

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

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

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

      【讨论】:

      • 那么我必须如何添加它?我是新手,所以遇到了问题。
      • 如果我使用 ListIterator&lt;ValidationObject&gt; ii=_validationObjects.iterator(); 然后给我类型不兼容的错误。
      • 使用_validationObjects.listIterator()方法获取ListIterator。我修改了我的帖子。
      猜你喜欢
      • 2015-01-14
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      相关资源
      最近更新 更多