`
cuiran
  • 浏览: 82256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Exception in thread "Thread-2" java.util.ConcurrentModificationException

    博客分类:
  • java
阅读更多

今天在做对一个集合做迭代的时候,判断并且删除存在的对象时候报了如题的错误

更改前的:

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();

0
0
分享到:
评论

相关推荐

    java.util.ConcurrentModificationException 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

    Exception in thread “main“ java.util.InputMismatchException.pdf

    在Java编程语言中,`java.util.InputMismatchException`是一个常见的运行时异常,它通常发生在尝试从数据源(如控制台、文件或数据库)读取数据时,遇到的数据类型与预期的不匹配。在这个特定的场景中,问题出在主线...

    asm-util-3.2.jar

    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...

    ws-commons-util-1.0.2.zip_ws-comm-util.jar

    【标题】"ws-commons-util-1.0.2.zip_ws-comm-util.jar" 提供的是一个名为 ws-commons-util 的库的版本1.0.2,这个库经过压缩打包成ZIP格式,其中包含了 ws-comm-util.jar 文件。这个JAR文件是Java应用程序中常见的...

    jetty-util-9.4.43.v20210629-API文档-中文版.zip

    赠送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...

    protobuf-java-util-3.1.0.jar

    protobuf-java-util-3.1.0.jar下载,配合protobuf3.1.jar的util包

    apr-1.4.6.tar.gz、apr-iconv-1.2.1.tar.gz、apr-util-1.4.1.tar.gz

    本文将详细解析标题和描述中提到的几个关键压缩包:`apr-1.4.6.tar.gz`、`apr-iconv-1.2.1.tar.gz` 和 `apr-util-1.4.1.tar.gz`,这些都是Apache安装的重要组成部分。 首先,`apr-1.4.6.tar.gz` 是APR库的主要版本...

    cors-filter-1.7.jar java-util-1.9.1.jar

    在给定的文件信息中,我们看到两个重要的文件:"cors-filter-1.7.jar" 和 "java-util-1.9.1.jar",这些都是与Java相关的库文件,通常用于增强应用程序的功能。 首先,让我们来详细探讨"Cors Filter"。CORS(Cross-...

    backport-util-concurrent.jar

    backport-util-concurrent.jarbackport-util-concurrent.jarbackport-util-concurrent.jar

    jetty-util-9.4.11.v20180605-API文档-中文版.zip

    赠送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...

    jetty-util-ajax-9.3.19.v20170502-API文档-中英对照版.zip

    赠送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-...

    jdk-8u241-linux-x64.tar.gz

    5. **日期与时间API**:`java.time`包替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更直观、易用且功能丰富的日期和时间API,如`LocalDate`, `LocalTime`, `LocalDateTime`, `ZonedDateTime`等。...

    jdk-8u251-linux-x64.tar.gz

    4. **日期和时间API的改进**:JDK8引入了新的`java.time`包,替换原有的`java.util.Date`和`java.util.Calendar`,提供了更加友好和易用的日期和时间API。 5. **接口的默认方法**:接口现在可以定义默认方法,这些...

    jdk-8u201-linux-x64.tar.gz jdk8版本下载

    日期和时间API的改进则消除了对`java.util.Date`和`java.util.Calendar`类的依赖,提供了更直观的日期和时间操作。 在Linux环境中,JDK的使用还包括配置Tomcat、Eclipse等Java应用服务器和IDE,以及进行Java项目的...

    jdk-8u151-linux-x64.tar.gz 【官方jdk1.8 linux版】

    - **Date和Time API的改进**:移除了旧的`java.util.Date`和`java.util.Calendar`,引入了新的`java.time`包,提供更强大、更易用的时间日期处理功能。 - **方法引用来替代匿名内部类**:可以引用一个方法的签名,...

    jetty-util-9.4.8.v20171121-API文档-中文版.zip

    赠送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...

Global site tag (gtag.js) - Google Analytics