Java: 运行-在数组列表中删除时出现时间错误
Java: Run-time error during remove in an array list
我正在从事一个管理小型学生花名册的项目。所需的功能之一是能够使用学生 ID 标识符删除学生的记录,并且如果学生 ID 不存在,则该删除功能会给出错误。
本次remove验证需要测试的是两次remove同一个学号,看第二次调用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 循环中以删除学生。
*我用contain来查看数组列表是否包含学号。如果是,则删除 if/else 执行。如果没有,它会给出失败打印输出和 returns。
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)
有什么想法吗?
你不想说学生 ID 不存在于你留空的循环的第一个 else 部分吗?
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.");
}
}
在使用迭代器遍历列表时,您无法安全地修改列表的内容。使用 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>
来保存你的花名册,关键是学生 ID。
试试这个:
for(Iterator<String> it = myRoster.iterator(); it.hasNext();) {
String b = it.next();
...
if (...) {
it.remove();
...
}
...
}
我正在从事一个管理小型学生花名册的项目。所需的功能之一是能够使用学生 ID 标识符删除学生的记录,并且如果学生 ID 不存在,则该删除功能会给出错误。
本次remove验证需要测试的是两次remove同一个学号,看第二次调用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 循环中以删除学生。
*我用contain来查看数组列表是否包含学号。如果是,则删除 if/else 执行。如果没有,它会给出失败打印输出和 returns。
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)
有什么想法吗?
你不想说学生 ID 不存在于你留空的循环的第一个 else 部分吗?
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.");
}
}
在使用迭代器遍历列表时,您无法安全地修改列表的内容。使用 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>
来保存你的花名册,关键是学生 ID。
试试这个:
for(Iterator<String> it = myRoster.iterator(); it.hasNext();) {
String b = it.next();
...
if (...) {
it.remove();
...
}
...
}