今天在做对一个集合做迭代的时候,判断并且删除存在的对象时候报了如题的错误
更改前的:
Iterator<Foe> it=draw.getFoes().iterator();
while(it.hasNext()){
Foe foe=it.next();
if(foe.getX()==shot.getX()&&foe.getY()==shot.getY()){
draw.getFoes().remove(foe);
draw.getShots().remove(shot);
System.out.println("射中敌人");
}
}
更改后
Iterator<Foe> it=draw.getFoes().iterator();
while(it.hasNext()){
Foe foe=it.next();
if(foe.getX()==shot.getX()&&foe.getY()==shot.getY()){
// draw.getFoes().remove(foe);
it.remove();
draw.getShots().remove(shot);
System.out.println("射中敌人");
}
}
后来在网上找了个资料看:
当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行, java.util.ConcurrentModificationException 异常也将被抛出。 Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.
修改后: it.remove();
|
分享到:
相关推荐
java.util.ConcurrentModificationException 异常问题详解1
Exception in thread “main“ java.util.InputMismatchException
asm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util...
赠送jar包:jetty-util-9.4.43.v20210629.jar; 赠送原API文档:jetty-util-9.4.43.v20210629-javadoc.jar; 赠送源代码:jetty-util-9.4.43.v20210629-sources.jar; 赠送Maven依赖信息文件:jetty-util-9.4.43.v...
java-util-iterator.pdfjava-util-iterator.pdfjava-util-iterator.pdf
asm-util-1.3.4.jar, asm-util-1.3.5.jar, asm-util-1.4.1.jar, asm-util-1.4.3.jar, asm-util-1.5.1.jar, asm-util-1.5.2.jar, asm-util-1.5.3.jar, asm-util-2.0.jar, asm-util-2.1.jar, asm-util-2.2.1-sources....
api-util-1.0.0-M20.jar asm-3.2.jar avro-1.7.7.jar commons-beanutils-1.9.4.jar commons-cli-1.2.jar commons-codec-1.4.jar commons-collections-3.2.2.jar commons-compress-1.19.jar commons-configuration-...
backport-util-concurrent.jarbackport-util-concurrent.jarbackport-util-concurrent.jar
赠送jar包:jetty-util-9.4.11.v20180605.jar; 赠送原API文档:jetty-util-9.4.11.v20180605-javadoc.jar; 赠送源代码:jetty-util-9.4.11.v20180605-sources.jar; 赠送Maven依赖信息文件:jetty-util-9.4.11.v...
赠送jar包:jetty-util-ajax-9.3.19.v20170502.jar; 赠送原API文档:jetty-util-ajax-9.3.19.v20170502-javadoc.jar; 赠送源代码:jetty-util-ajax-9.3.19.v20170502-sources.jar; 赠送Maven依赖信息文件:jetty-...
赠送jar包:jetty-util-9.4.8.v20171121.jar; 赠送原API文档:jetty-util-9.4.8.v20171121-javadoc.jar; 赠送源代码:jetty-util-9.4.8.v20171121-sources.jar; 赠送Maven依赖信息文件:jetty-util-9.4.8.v...
此jar包可以使Java客户端调用FastDFS上传文件
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
赠送jar包:protobuf-java-util-shaded-351-0.9.jar; 赠送原API文档:protobuf-java-util-shaded-351-0.9-javadoc.jar; 赠送源代码:protobuf-java-util-shaded-351-0.9-sources.jar; 赠送Maven依赖信息文件:...
tomcat 跨域 jar包 cors-filter-1.7.jar java-util-1.9.1.jar
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
apr-util-1.5.4.tar.gz apr-1.5.1.tar.gz pcre-8.20.tar.gz httpd-2.4.10.tar.gz