在以下功能中,我声明了本地变量allPeopel
和itr
(它们是覆盖全局变量)。如果我评论局部变量(以下正确的误解之间),则会抛出constrentModificationerror。但是,如果我使用局部变量而不是全局变量,则代码可以正常工作。我不明白为什么是这种情况?课程中还有许多其他功能,因此我试图将全局变量用于更有效的代码。
public void removeAPerson(){
int id;
Scanner sc = new Scanner(System.in);
System.out.print("Enter ID of person to delete > ");
id = sc.nextInt();
sc.nextLine();
System.out.println();
/*************************************/
ArrayList<Person> allPeople;
allPeople = Person.getAllPeople();
Iterator itr = allPeople.iterator();
/*************************************/
while(itr.hasNext()){
Person obj = (Person) itr.next();
int ID = obj.getID2();
if(ID == id){
itr.remove();
break;
}
}
}
这是您可能拥有的内容的草图:
public class MyClass {
List<Person> persons = new ArrayList<>();
Iterator<Person> iter = strs.iterator();
public void addPerson(Person p) {
persons.add(p);
}
public void removePerson() {
... your posted code ...
}
public static void main(String... args) {
MyClass c = new MyClass();
c.addPerson(new Person());
c.removePerson();
}
发生的事情是您仅实例化迭代器一次,然后将一些内容添加到列表中,然后使用迭代器。重复使用这样的迭代器的全局实例永远是没有意义的。具体来说,在实例化之后,除了通过迭代器本身之外,不得更改列表。
使用全局变量是一回事,但是使用迭代器的全局实例是另一回事。两者都是错误的,但后者是致命的。
使用本地变量,每次线程调用您的方法都会创建这些变量的新实例,这些变量无法提供任何其他线程(除非您特别允许您传递引用)。因此,没有其他线程可以修改您的对象。
使用global(我认为您是指instance
变量,属性),所有可以访问对象访问对象的线程都可以访问对象的属性(让它直接是,通过运行您的对象方法来让它成为可以在您的另一个线程运行迭代时修改它们。由于iterator
可以检测到何时迭代的Collection
已修改,因此发生这种情况会引发异常(这没什么意思是"我迭代集合的所有对象,但是这些对象不再相同,所以太困惑了,我失败了"。