【问题标题】:How can i remove an object from the ArrayList while iterating without getting an "Concurrent Modification Error"如何在迭代时从 ArrayList 中删除对象而不会出现“并发修改错误”
【发布时间】:2021-04-09 23:10:51
【问题描述】:

在我创建和管理联系人的项目中,当我在 for 循环中从数组列表中删除对象时,会引发并发修改异常(如 javadoc 中所述)。

我的问题是如何在不出现“并发修改异常”的情况下删除对象

我查看了类似的帖子但找不到答案,有些帖子的代码很复杂,很多人问为什么没有抛出异常。 This question didn't help me/this specific problem 你也可以阅读上面的链接来帮助我(我比较新)

我正在使用 jdk 14,ide:intelliJ,

我已经创建了管理联系人和获取输入的方法,但我只提供了引发异常的方法。

public class Main {

    private static ArrayList<Contact> contacts;
     contacts = new ArrayList<>();

     private static void deleteContact() {
            System.out.println("Please enter contact name: ");
            String name = scanner.next();
            if (name.equals("")){
                System.out.println("Please enter the name");
                deleteContact();
            }else{
                boolean doesExist = false;
    
                for(Contact c:contacts) {       //Error pointed on this line.
                    if (c.getName().equals(name)) {
                        doesExist = true;
                        contacts.remove(c);
                    }
                }
                if (!doesExist){
                    System.out.println("There is no such contact");
                }
            }
            showInitialOptions();
        }
}

来自“联系”类的重要代码

public class Contact {
    private String name;
    private int number;
    private String email;
  
    public Contact(String name, int number, String email ) {
        this.name = name;
        this.number = number;
        this.email = email;
       ;
    }
  public String getName() {
        return name;
    }
}

【问题讨论】:

标签: java arraylist concurrentmodification


【解决方案1】:

您可以使用Iterator 来迭代ArrayList

Iterator<Contact> it = contacts.iterator();
while(it.hasNext()){
    Contact c = it.next();
    if(c.getName().equals(name)){
        doesExist = true;
        it.remove();
    }
}

【讨论】:

    【解决方案2】:

    对于您的特定问题,请从以下位置更改行

    for(Contact c:contacts) {
    

    for(int i=contacts.size()-1; i>-1; i--) {
    

    它应该可以工作

    【讨论】:

    • 我应该删除这个问题,还是留给可能需要这个问题的其他人?
    • @PenielDev 非常感谢 - 欢迎您。你没有点击我 20 分钟前在评论部分提供的链接吗?
    • @camickr 这是一个 OutofBoundException 兄弟
    • 如果解决方案不一样,您为什么认为我会花时间回答?问题是相同的。这两个问题都试图从 ArrayList 中删除项目。问题中的原始方法不同(这就是为什么有不同的Exception),但是解决方案是相同的,因为要求是相同的。
    • @camickr 对不起兄弟,我的坏,在快速滚动时,我只看到他们在谈论大小和长度。感谢您的帮助和关心。
    猜你喜欢
    • 2018-10-21
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2014-07-12
    • 1970-01-01
    • 2013-12-14
    • 2011-12-27
    相关资源
    最近更新 更多