首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >concurrentModificationException in ArrayList

concurrentModificationException in ArrayList
EN

Stack Overflow用户
提问于 2014-11-16 08:03:32
回答 4查看 19.8K关注 0票数 6

问题陈述:为下列场景设计一个系统:

1.项目列表包含多个项目的项目代码、名称、比率和数量。

  1. 每当在列表中添加新项时,将检查项目代码的唯一性。登记一种新产品的价格。
  2. 项目的时间-时间比率可能会改变。
  3. 每当某个项目被发布或接收时,就会检查该项目是否存在,并更新数量。
  4. 在问题的情况下,也要检查数量的可用性。
  5. 用户也可能想知道一个项目的价格/数量。
  6. 找出多少物品的费用超过了一个给定的数额。金额将是一个参数。
  7. 请记住,如果给出了无效的项代码,则方法必须返回错误代码。

针对上述问题,我创建了一个具有以下成员的Item类:

代码语言:javascript
复制
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类来访问Item类,以便对一个项执行所有操作.这里是商店班的一部分。

代码语言:javascript
复制
    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 线程"main“中出现异常 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) 在items.ItemDemo.main(ItemDemo.java:26)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-16 08:08:37

你是在你的列表中添加一个项目,同时迭代它。除非使用迭代器本身将新项添加到列表中,否则此操作无效。

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

票数 11
EN

Stack Overflow用户

发布于 2014-11-16 08:27:35

search(long code)方法中只需添加

代码语言:javascript
复制
itr = ItemList.iterator();

在此之前

代码语言:javascript
复制
 while(itr.hasNext()) 

这是因为您在迭代器仍然指向旧列表时更改了列表。一旦在不更新迭代器的情况下添加项,就会得到并发异常。

票数 5
EN

Stack Overflow用户

发布于 2018-04-13 10:28:01

当我们在声明迭代器服从the之后将元素添加到列表中时,就会出现这种情况。一旦尝试将所有项目添加到列表中,然后声明迭代器对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26955041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档