java ArrayList 清空元素时迭代器造成的错误

在 HeadFirst JAVA中,例子:攻击网站游戏

书中提供的在检查是否击中目标时的代码:

for(DotCom dotComToTest : dotComsList){
			result = dotComToTest.checkYourself(userGuess);
			if(result.equals("hit")){
				break;
			}else if(result.equals("kill")){
				dotComsList.remove(dotComToTest);
				break;
			}
		}

其中使用的迭代器的方式对目标列表进行遍历,但是在执行中却出现了错误。

错误类型: java.util.AbstractList$Itr.next()

是因为ArrayList中元素清空,导致迭代器报错

多种情况可以参考

http://lggege.iteye.com/blog/249430

代码修正:

 for(int i = 0; i < dotComsList.size(); i ++){
 			result = dotComsList.get(i).checkYourself(userGuess);
 			if(result.equals("hit")){
 				break;
 			}else if(result.equals("kill")){
 				dotComsList.remove(i);
 				break;
 			}
 		}
时间: 2024-12-20 17:07:04

java ArrayList 清空元素时迭代器造成的错误的相关文章

Java切换JDK版本时遇到的小错误。

最近学习loadrunner,学习到java vuser地方,因为LR11只支持JDK 1.6版本(且必须为32位),而我本地用的是JDK1.7版本,所以就想把JDK从1.7切换成1.6.于是开始重新配置环境变量,将JAVA_HOME从1.7指向1.6,但是奇怪的事情发生了,配置完成后,显示的依然是1.7的版本,百思不得其解,好吧百度一下:最后得知原因:因为在C:\windows\System32下,还有java.exe,这个java.exe依然是1.7的,要想变为1.6的,必须将PATH里的J

[JS][jQuery]清空元素html(&quot;&quot;)、innerHTML=&quot;&quot; 与 empty()的区别:关于内容泄露问题

清空元素html("").innerHTML="" 与 empty()的区别 一.清空元素的区别      1.错误做法一:            $("#test").html("");//该做法会导致内存泄露 2.错误做法二:            $("#test")[0].innerHTML="";  ;//该做法会导致内存泄露 3.正确做法:        //$("

[JS][jQuery]清空元素html(&quot;&quot;)、innerHTML=&quot;&quot; 与 empty()的区别 、remove()区别

清空元素html("").innerHTML="" 与 empty()的区别 一.清空元素的区别     1.错误做法一:           $("#test").html("");//该做法会导致内存泄露 2.错误做法二:            $("#test")[0].innerHTML="";  ;//该做法会导致内存泄露 3.正确做法:        //$("#t

java list 清空列表所有元素

Java list 清空列表所有元素 List<String> list = new ArrayList<String>(3);list.add("hello");list.add("cnblogs"); // 使用迭代器 for (Iterator<String> it = list.iterator(); ite.hasNext();) { String str = it.next(); if (list.contains(s

java中在for循环中remove元素时的陷阱

java.util.ConcurrentModificationException 如果删空了,会报上面这个异常 输出结果如下:remove前集合数据:a,a,b,a,a, remove后集合数据:a,b,a, 为什么会出现这种情况?原因是集合的大小是动态变化的,在删除第1个值为“a”的元素后,集合的大小已经发生了改变,但是i的值在删除后继续执行了加1操作,此时已经跳过了“a”元素后的元素(即原集合中第2个“a”元素). 如下删除集合中值为“a”的元素时: import java.util.*;

当JAVA集合移除自身集合元素时发生的诸多问题

一段代码目的是想删除集合中包含"a"字符串的集合项: public class TestForeach { public static void main(String[] args){ //ArrayList<String> lists = new ArrayList<String>(); Collection<String> lists = new HashSet<String>(); lists.add("abvd&quo

Java ArrayList实现原理

一.ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组.与Java中的数组相比,它的容量能动态增长.类似于C语言中的动态申请内存,动态增长内存. 当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变.ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,要往数组添加元素的弊端.实现的基本方法如下: 1. 快速查找:在物理内存上采用顺序存储结构,因此可根据索引

Java - ArrayList源码分析

java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小. 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小.默认初始容量为10.随着ArrayList中元素的增加,它的容量也会不断的自动增长.在每次添加新的元素时,Array

Java——ArrayList底层源码分析

1.简介 ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中. 当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制.移动.代价比较高.因此,它适合随机查找和遍历,不适合插入和删除. 线性表的顺序存储,插入删除元素的时间复杂度为O(n),求表长以及增加元素,取第 i 元素的时间复杂度为O(1). ArrayL