并发修改异常
并发修改异常: ConcurrentModificationException
产生原因: 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案: 用for循环遍历,然后用集合对象做对应的操作即可
并发修改异常的练习
xxxxxxxxxxpackage ch14;
import java.util.ArrayList;import java.util.Iterator;import java.util.List;
/*
需求: 1、有一个集合:List<String> list = new ArrayList<String>(); 2、里面有三个元素:hello、world、java 3、遍历集合,得到每一个元素,如果有world这个元素,就添加一个javaee元素,用代码实现
*/
public class a_9_1测试 {
public static void main(String[] args) {
//创建集合对象 List<String> list = new ArrayList<String>(); //选中List,按Ctrl+B,查看源码。再选中ArrayList看一下源码
//添加元素 list.add("hello"); list.add("world"); list.add("java");
//遍历集合,得到每一个元素,如果有world这个元素,就添加一个javaee元素 /*Iterator<String> it = list.iterator(); //这种遍历方法会报错。先注释,建议用最下面的for循环遍历方式 while (it.hasNext()){ String s = it.next(); //不要用next方法获取元素 if(s.equals("world")){ //equals是字符串方法,比较的是字符串的内容,返回布尔值 list.add("javaee"); } }*/ //输出集合对象 //System.out.println(list); //为什么会报错呢,ConcurrentModificationException。这里报错先注释,需要自己解开 //该异常继承自RuntimeException,即运行时异常 //异常原因:当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常 //去‘a_9_2并发修改异常的源码分析.txt’里面看原因,总结到那里去了
//---------------------------------------------------------------------------------------------------------------
//解决方法,如下 //原理:遍历循环对于List集合,不建议使用迭代器的方式。要想不抛出并发异常,就使用for循环遍历方式 for(int i=0; i<list.size(); i++){ String s = list.get(i); //建议用get方法获取元素 if(s.equals("world")){ //equals是字符串方法,比较的是字符串的内容,返回布尔值 list.add("javaee"); } } System.out.println(list); //优点:保证线程安全
}}