java - ArrayList 中的 concurrentModificationException

标签 java exception arraylist

问题陈述: 针对以下场景设计一个系统:

1.An item list contains item code, name, rate, and quantity for several items.

  1. Whenever a new item is added in the list uniqueness of item code is to be checked. Register a new product with its price.

  2. Time to time rate of the items may change.

  3. Whenever an item is issued or received existence of the item is checked and quantity is updated.

  4. In case of issue, availability of quantity is also to be checked.

  5. User may also like to know price/quantity available for an item.

  6. Find how many items cost more than a given amount. The amount will be a parameter.

  7. Remember that the methods have to return an error code if for example an invalid item code is given

针对上述问题,我创建了一个包含以下成员的 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 类 来访问 Item 类,以进行所有操作 a Item... 这是 shop 类的一部分。

    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. Add items to list
2. Update item list
3. Issue item
4. Display item details
5. Exit
Choice: 1
Enter Item code: 123
Item name : qwerty
Rate : 12345
Quantity : 100
1. Add items to list
2. Update item list
3. Issue item
4. Display item details
5. Exit
Choice: 1
Enter Item code: 1212
Exception in thread "main"
java.util.ConcurrentModificationException at
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at
java.util.ArrayList$Itr.next(ArrayList.java:851) at
items.Shop.search(Shop.java:28) at items.Shop.addItem(Shop.java:55)
at items.ItemDemo.main(ItemDemo.java:26)

我做错了什么? (试图给所有相关类(class))

最佳答案

您在迭代时将项目添加到列表中。那是无效的,除非你 use the iterator itself将新项目添加到列表中。

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

关于java - ArrayList 中的 concurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955041/

相关文章:

java - 使用 Java 中的 COM .dll,而不使用 regsvr32 注册库

java - Hibernate 标准给出无效结果

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - 如何将字符串数组添加到 JSON

java - 将文本文件数据加载到 JTextfield 中

java - (Gson) JSON 到包含 ArrayList<Class> 的 Java 对象

java - 重复 Activity 日期处理冬季时间/夏季时间

java - 如何根据输入的文本向JtextPane添加规则

java - JUnit 断言是否会被禁用?

java - 自定义异常类应该继承Exception还是Throwable?