ArrayList中的concurrentModificationException

时间:2014-11-16 08:03:32

标签: java exception arraylist

问题陈述: 为以下场景设计系统:

  

1.项目清单包含多个项目的项目代码,名称,费率和数量。

     
      
  1. 每当在列表中添加新项目时,都要检查项目代码的唯一性。以价格注册新产品。

  2.   
  3. 项目的时间费率可能会发生变化。

  4.   
  5. 每当签发或收到物品时,都会检查物品的存在并更新数量。

  6.   
  7. 如有问题,还应检查数量的可用性。

  8.   
  9. 用户还可能想知道某件商品的价格/数量。

  10.   
  11. 查找超过给定金额的项目费用。金额将是一个参数。

  12.   
  13. 请记住,如果提供了无效的商品代码,方法必须返回错误代码

  14.   

针对上述问题,我创建了一个 Item 类,其中包含以下成员:

private String name;
private double rate;
private long code;
private int quantity;

public Item()
public Item(String name, double rate, long code, int quantity)
public Item(Item item) 
public String toString()
public String getName() 
public void setName(String name) 
public double getRate()     
public void setRate(double rate) 
public long getCode()
public void setCode(long code) 
public int getQuantity()
public void setQuantity(int quantity)

现在我创建了一个 商店类 来访问 商品类 ,以便执行所有操作 一件物品......这是商店的一部分。

    private ArrayList<Item> ItemList;
    private Iterator<Item> itr;

    public Shop() {
        System.out.println("New Shop for Items created.");
        ItemList = new ArrayList<Item>();
        itr= ItemList.iterator();
    }

    public Item search(long code) {
        Item item;
        while(itr.hasNext()) {
            item = new Item(itr.next());
            if (item.getCode() == code) {
                return item;
            }
        }
        return null;
    }

    public void addItem() throws InputMisMatchEXception{
        long aCode;
        String aName;
        double aRate;
        int aQuantity;
        Item foundItem;

            System.out.println("Enter Item code:");
            aCode = sc.nextLong();
            foundItem = search(aCode);
            if (foundItem == null) {
                System.out.println("Item name : ");
                aName = sc.next();
                System.out.println("Rate : ");
                aRate = sc.nextDouble();
                System.out.println("Quantity : ");
                aQuantity = sc.nextInt();
                Item aItem = new Item(aName, aRate, aCode, aQuantity);
                ItemList.add(aItem);
            } else if (foundItem != null) {
                System.out.println("Item exists");
            }
    }

现在,当我添加一个新项目时,它可以工作..但是当我添加第二个元素时,它会抛出一个

  

ConcurrentModificationException

这是一个示例输出:
创建项目的新商店 *

  

----- ------ ITEM
  1.将项目添加到列表
  2.更新项目列表
  3.发行项目
  4.显示项目详细信息
  5.退出
     选择:1
  输入项目代码:123
  项目名称:qwerty
  评价:12345
  数量:100
  1.将项目添加到列表
  2.更新项目列表
  3.发行项目
  4.显示项目详细信息
  5.退出
     选择:1
  输入项目代码:1212
  线程中的例外&#34; main&#34;
  java的java.util.ConcurrentModificationException   java.util.ArrayList $ Itr.checkForComodification(ArrayList.java:901)在

  java.util.ArrayList $ Itr.next(ArrayList.java:851)在   items.Shop.search(Shop.java:28)at items.Shop.addItem(Shop.java:55)
    at items.ItemDemo.main(ItemDemo.java:26)

我做错了什么? (试图提供所有相关课程)

3 个答案:

答案 0 :(得分:5)

您正在迭代它时将项目添加到列表中。除非您use the iterator itself将新项目添加到列表中,否则无效。

请注意,每调用search()方法时使用相同的迭代器可能会出错。迭代器应该是search()方法的局部变量而不是字段。

答案 1 :(得分:1)

search(long code)方法中添加

itr = ItemList.iterator();

之前

 while(itr.hasNext()) 

这是因为在迭代器仍指向旧列表时更改列表。一旦添加项而不更新迭代器,您将获得并发异常。

答案 2 :(得分:1)

在声明迭代器obejct之后将元素添加到列表中。一旦尝试将所有元素添加到列表中,然后声明迭代器对象。