Facade实现中的ConcurrentModificationException

时间:2017-05-04 19:44:57

标签: java facade

我正在实现这个Facade来包装java中的LinkedList,TreeSet和HashSet类。

import java.util.Iterator;

public class CollectionFacadeSet implements SimpleSet{
protected java.util.Collection<java.lang.String> collection;
private Iterator<java.lang.String> iterator;
private int count;
/**
* Creates a new facade wrapping the specified collection.
* @param collection - The Collection to wrap.
 */
public CollectionFacadeSet(java.util.Collection<java.lang.String> collection){

    this.collection=collection;
    iterator = this.collection.iterator();
    count=0;
}
/**
* Add a specified element to the set if it's not already in it.
* @param newValue New value to add to the set
* @return False iff newValue already exists in the set
*/
public boolean add(java.lang.String newValue){
    if(contains(newValue))
        return false;
    collection.add(newValue);
    return true;
}
/**
* Look for a specified value in the set.
* @param searchVal Value to search for
* @return True iff searchVal is found in the set
*/
public boolean contains(java.lang.String searchVal){
    while(iterator.hasNext())
    {
        java.lang.String myString=iterator.next(); //issue
        System.out.println(myString);
        if(myString.equals(searchVal))
            return true;
    }
    return false;
}

在contains函数中,一旦我创建了一个字符串来托管下一个(当前)对象,我就会收到以下错误:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
    at java.util.LinkedList$ListItr.next(LinkedList.java:888)`

我几乎按照其他问题编写的方式,但似乎我的循环仍然引发异常。

1 个答案:

答案 0 :(得分:2)

您的add方法在创建迭代器后修改了集合。

不是在成员变量中使用迭代器,而是在contains方法中声明它:

public boolean contains(java.lang.String searchVal){
  Iterator<String> iterator = collection.iterator();
  while(iterator.hasNext()) {
    // ...

您当前代码的另一个问题是您的contains方法耗尽了迭代器 - 一旦您完成了一次并发现该元素未被包含,它就不会重置,这意味着{ {1}}方法下次无法找到该元素。将其声明为局部变量也可以解决这个问题。

当然,你根本不需要contains,除了你打印出这些元素这一事实。 (我猜你只是为了调试而做这件事;它并不是真的有用)。

您只需使用Iterator

即可
Collection.contains