当前位置: 首页 > 知识库问答 >
问题:

ArrayList中的concurrentModificationException

柯乐池
2023-03-14

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

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类来访问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

以下是示例输出:
创建项目的新商店。
*

-----项目----
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)在items.shop.addItem(shop.java:55)

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

共有2个答案

姚文轩
2023-03-14

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

itr = ItemList.iterator();

之前

 while(itr.hasNext()) 

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

通京
2023-03-14

您在迭代列表中的一个项目时将其添加到列表中。除非使用迭代器本身将新项添加到列表中,否则这是无效的。

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

 类似资料:
  • 我有一个ArrayList of String。 在每个索引上的外部ArrayList中,每个内部ArrayList有四个项目,有四个参数。 联系人ID 联系人姓名 联系地址 联系号码 现在,我想根据Contact Name参数对的完整ArrayList进行排序。 意味着我要访问外部Arraylist,外部Arraylist的每个索引上存在的内部Arraylist应该根据联系人名称进行排序。 比较

  • 问题内容: 我有一个数据库记录的数组列表。我想把它放在我的J2ME列表中。但是J2ME中没有split或arraylist。我该怎么做?一个代码示例将是不错的。 问题答案: 如果使用()更好。它会帮助你。

  • 问题内容: 以下代码输出 但是,我期望的是 我哪里错了? 问题答案: 您将两次向同一内部引用添加到外部列表。因此,当您更改内部列表时(通过添加300),您会在“两个”内部列表中看到它(实际上,只有一个内部列表,外部列表中存储了两个引用)。 为了获得理想的结果,您应该创建一个新的内部列表:

  • 我碰到一堆代码 但是如果我使用普通的ArrayList它会给我输入图像描述时的错误herstrong texte善意的帮助

  • 但是,后来当我试图将整数添加到正确的“内部”数组列表中时,我无法将整数添加到ArrayList类型的位置中。我还得到一个索引超出界限的错误。 解决这个问题的方法是将整数强制转换为ArrayList类型,但这意味着我将在内部数组列表中添加一个数组列表,这不是我想要的。我想在正确的“内部”ArrayList中添加一个int。

  • 我是Java初学者,我正在尝试创建一个ArrayList来存储包含整数的ArrayList。我已经知道外部ArrayList的大小,并希望存储内部ArrayList。例如,我希望将所有狗的ID号添加到存储在外部ArrayList第一个索引中的ArrayList中,猫的ID号添加到第二个索引中,蜥蜴的ID号添加到第三个索引中。这将以随机的顺序发生,所以我希望外部ArrayList已经初始化了它的大小