为什么我在Java中使用Stack获取java.util.ConcurrentModificationException?

时间:2013-11-26 05:02:42

标签: java collections iterator stack

尽管使用带有堆栈的迭代器

,我仍然遇到并发修改异常
package samplecodes;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class ReOrderStack {






    public static Stack<Integer> reorder(Stack<Integer> s )
    {
        Queue <Integer> q= new LinkedList<Integer>();

        if(s==null|| s.isEmpty())
            return s;
        // Use an iterator to prevent concurrent modification exception!

        Iterator<Integer> it = s.iterator();
        while(it.hasNext())
        {
            Integer val= it.next();// concurrent modification exception!
            if(val>=0)
            {
                s.remove(val);
                q.add(val);
            }
        }

    //we've inspected the stack

    //add back from the queue to stack
    while(!q.isEmpty())
    {
        Integer val=q.remove();

        s.push(val);
    }
        return s;

    }
}

有什么想法?

2 个答案:

答案 0 :(得分:4)

Stack.remove不安全。它与ConcurrentModificationException一起发生Iterator。为避免ConcurrentModificationException使用Iterator.remove()。  尝试,

Iterator<Integer> it = s.iterator();
    while(it.hasNext())
    {
        Integer val= it.next();          
        if(val>=0)
        {
            it.remove(); //Use Iterator.remove
            //s.remove(val);
            q.add(val);
        }
    }

答案 1 :(得分:0)

迭代时无法修改堆栈。您必须删除行s.remove()以防止发生此错误。它发生是因为迭代器有一个现在与原始版本不同的副本。如果要删除ever元素并添加到队列,可以使用以下代码:

while(!s.empty()) {
    val = s.pop();
    if(val>=0) {
        q.add(val);
    }
}