首页 文章

ArrayList中的concurrentModificationException

提问于
浏览
1

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

1.项目列表包含多个项目的项目代码,名称,费率和数量 . 每当在列表中添加新项目时,都要检查项目代码的唯一性 . 以价格注册新产品 . 物品的时间比率可能会发生变化 . 每当发出或接收物品时,都会检查物品的存在并更新数量 . 如有问题,还应检查数量的可用性 . 用户还可能想知道物品的可用价格/数量 . 查找多少项目的费用超过给定金额 . 金额将是一个参数 . 请记住,如果给出了无效的项代码,则方法必须返回错误代码

对于上述问题,我创建了一个包含以下成员的 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)

现在我创建了一个 Shop class 来访问 Item class ,对一个Item做所有操作......这是商店类的一部分 .

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

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

-----项目------ 1.将项目添加到列表2.更新项目列表3.发布项目4.显示项目详细信息5.退出选择:1输入项目代码:123项目名称:qwerty评分: 12345数量:100 1.将项目添加到列表2.更新项目列表3.问题项目4.显示项目详细信息5.退出选择:1输入项目代码:1212 java.util中线程“main”java.util.ConcurrentModificationException中的异常.ArrayList $ Itr.checkForComodification(ArrayList.java:901)java.util.ArrayList $ Itr.next(ArrayList.java:851)at items.Shop.search(Shop.java:28)items.Shop.addItem( Shop.java:55)at items.ItemDemo.main(ItemDemo.java:26)

我究竟做错了什么? (试图给所有相关课程)

3 回答

  • 1

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

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

  • 5

    search(long code) 方法中添加

    itr = ItemList.iterator();
    

    之前

    while(itr.hasNext())
    

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

  • 1

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

相关问题