Java ConcurrentModificationError,否则为if语句,并为每个循环(我不知道,不能使用迭代器)

时间:2019-01-18 04:27:05

标签: java

else if语句可以按预期工作,除非运行完成后出现此ConcurrentModificationException错误。我认为可能是每个循环的原因,但我不太确定。

 else if(input == 2){
            System.out.println("Enter a period");
            int periodInput = sc.nextInt();
            System.out.println("Enter the students name (Dont include a space between the first and last name)" );
            String nameInput = sc.next();
            if(periodInput == 3){
                for(Student a: period3){
                    if(a.getName().equals(nameInput)){
                        period3.remove(a);
                        System.out.println(period3);
                    }else{
                        System.out.println("No student was found with this name");
                    }
                }
            }

5 个答案:

答案 0 :(得分:0)

迭代时不能修改集合的结构。您应该更喜欢使用Iterator。使用类似这样的内容:

          for(Iterator<Student> stItr = period3.iterator(); stItr.hashNext();){
                Student a = stItr.next();
                if(a.getName().equals(nameInput)){
                    stItr.remove();
                    System.out.println(period3);
                }else{
                    System.out.println("No student was found with this name");
                }
            }

答案 1 :(得分:0)

编辑:我想出了如何使用for循环而不是每个循环来解决我的问题

if(periodInput == 3) {
                for(int i=0; i<=period3.size()-1; i++) {
                    if(period3.get(i).getName().equals(nameInput)) {
                        period3.remove(i);
                        System.out.println(period3);
                        break;
                    }
                }
            }
            else if(periodInput == 5) {
                for(int i=0; i<=period5.size()-1; i++) {
                    if(period5.get(i).getName().equals(nameInput)) {
                        period5.remove(i);
                        System.out.println(period5);
                        break;
                    }
                }
            }

答案 2 :(得分:0)

如先前的回答所述,Java不允许在for-each循环中对列表进行并发修改。您将继续使用的解决方案将起作用,因为您没有在列表本身上循环,而是使用整数进行循环,并且在每次迭代之后,您都在检查数组的大小(每次删除后都会对其进行修改),因此循环知道去除。您也可以尝试以下方法:

            else if(input == 2){
            List<Student> removalList = new ArrayList<Student>();
            System.out.println("Enter a period");
            int periodInput = sc.nextInt();
            System.out.println("Enter the students name (Dont include a space between the first and last name)" );
            String nameInput = sc.next();
            if(periodInput == 3){
                for(Student a: period3){
                    if(a.getName().equals(nameInput)){
                        removalList.add(a);
                    }
                }
                if(!removalList.isEmpty()){
                    for(Student stu: removalList){
                        period3.remove(stu);
                    }
                    System.out.println(period3);
                } else{
                    System.out.println("No student was found with this name");
                }
            }

答案 3 :(得分:0)

如下定义您的“ period03”,

List<Student> period3 = new CopyOnWriteArrayList<Student>();

如果有任何问题,请通知我。

答案 4 :(得分:0)

您无法修改要迭代的集合(迭代器已损坏)。想象一下,如果您要按索引从i = 0迭代到size()并在此方式更新集合...

使用过滤器而不是for循环(假设period3是一个集合-列表)

更改此

for(Student a: period3){
    if(a.getName().equals(nameInput)){
        period3.remove(a);
        System.out.println(period3);
    }else{
        System.out.println("No student was found with this name");
    }
 }

period3 = period3.stream().filter(student -> !student.getName().equals(nameInput)).collect(toList());

如果不是Java 8+选项,则-创建结果集合并向其中添加合格的项,而不是对原始列表进行变异。