Java:在数组列表中删除期间的运行时错误

时间:2017-03-08 22:58:06

标签: java arraylist runtime-error concurrentmodification

我正在开展一个管理小学生名单的项目。其中一个必需的功能是能够使用学生ID标识符删除学生的记录,并且如果学生ID不存在则删除该功能以提供错误。

此删除验证所需的测试是删除相同的学生ID两次,并查看第二次调用remove方法时是否打印错误消息。

第一个删除方法调用正在运行,并成功删除了被调用学生ID的元素。但是,第二个删除给我一个并发修改异常错误。

以下代码创建Student数组列表并调用remove方法(两次)。

static ArrayList<Student> myRoster = new ArrayList<>();

public static void main(String[] args)
{
    // add students to the roster
    add("1", "John", "Smith", "John1989@gmail.com", "20", 
    88, 79, 59);
    add("2", "Suzan", "Erickson", "Erickson_1990@gmail.com", "19", 
    91, 72, 85);
    add("3", "Jack", "Napoli", "The_lawyer99yahoo.com", "19", 
    85, 84, 87);
    add("4", "Erin", "Black", "Erin.black@.com", "22", 
    91, 98, 82);

    //loop through the ArrayList and for each element:
    remove("3");
    remove("3");

这是删除方法。以下是我目前对这应该如何运作的想法:

*为了首先检查学生ID是否存在,我将if / else删除嵌入式if / else循环中的学生。

*我使用contains来查看数组列表是否包含学生ID。如果是,则删除if / else执行。如果没有,则打印输出失败并返回。

    public static void remove(String studentID)
    //remove student from roster by student ID
    //print error message if student is not found
    {
        for(Student b: myRoster)
        {
            String record = b.getStudentID();
            Boolean a = studentID.contains(studentID);
            if (a)
            {
                Boolean c = record.matches(studentID);
                if (c)
                {
                    myRoster.remove(b);
                    System.out.println("Student ID " + studentID + " was removed.");
                }
            else
                {
                    ;
                }  
            }
            else
            {
                System.out.println("Student ID does not exist.");
            }

这是我得到的错误:

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Roster.remove(Roster.java:48)
at Roster.main(Roster.java:28)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Roster.remove(Roster.java:48)
at Roster.main(Roster.java:28)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用Iterator迭代List时,无法安全地修改List的内容。使用ListIterator执行此操作。

ListIterator<Student> it = myRoster.listIterator();
while (it.hasNext()) {
    Student b = it.next();
    if (b.getStudentId() == studentId) {
        it.remove(); // Removes b from myRoster
    }
    ...
}

请注意,如果有很多学生,这将无法很好地扩展。你最好用Map<String, Student>来保持你的名册,其中的密钥是学生证。

答案 1 :(得分:0)

你不想说你的学生证在你的循环的第一个其他部分中不存在吗?

if (a)
{
    Boolean c = record.matches(studentID);
    if (c)
    {
        myRoster.remove(b);
        System.out.println("Student ID " + studentID + " was removed.");
    }
    else
    {
        System.out.println("Student ID does not exist.");
    }  
}

答案 2 :(得分:0)

试试这个:

for(Iterator<String> it = myRoster.iterator(); it.hasNext();) {
    String b = it.next();
    ...
    if (...) {
        it.remove();
        ...
    }
    ...
}