ConcurrentModificationException因遍历同时修改集合引发,需用Iterator或线程安全集合解决;2. NullPointerException由存取null元素导致,应校验null值并明确集合设计;3. IndexOutOfBoundsException因索引越界触发,需校验索引范围;4. ClassCastException由类型不匹配引起,应使用泛型避免类型擦除问题。

Java集合框架在开发中使用非常广泛,但在操作过程中容易因误用或边界情况处理不当引发异常。了解这些常见异常的成因和解决方法,有助于编写更健壮的代码。
1. ConcurrentModificationException(并发修改异常)
该异常通常出现在遍历集合的同时对集合进行结构性修改(如添加、删除元素),而未使用安全的迭代方式。
常见场景:- 使用普通for-each循环遍历ArrayList或HashMap时调用remove()方法
- 多线程环境下一个线程遍历,另一个线成品修改集合
- 使用Iterator的remove()方法进行删除操作
- 使用CopyOnWriteArrayList等写时复制的线程安全集合
- 在多线程环境中使用Collections.synchronizedList配合外部同步机制
2. NullPointerException(空指针异常)
当尝试向不允许null元素的集合中插入null,或访问集合中为null的元素时抛出。
典型情况:- HashMap允许null键和值,但ConcurrentHashMap不允许null键或值
- 调用集合元素的方法时未判断是否为null
- 在存取元素前检查null值,尤其是从外部传入的数据
- 使用Objects.requireNonNull()主动校验参数
- 优先选择不支持null的集合实现并明确设计意图
3. IndexOutOfBoundsException(索引越界异常)
访问基于索引的集合时,索引超出有效范围会触发此异常,常见于List实现类。
立即学习“Java免费学习笔记(深入)”;
触发条件:- get(int index)时index = size()
- set()、remove()等操作使用非法索引
- 访问前校验索引是否在[0, size())范围内
- 避免硬编码索引值,动态获取集合大小
- 使用增强for循环或迭代器代替索引遍历,减少错误机会
4. ClassCastException(类型转换异常)
在泛型集合中存储了不符合类型约束的对象,或强制转型失败时抛出。
发生原因:- 使用原始类型(raw type)添加不同类型元素导致类型擦除问题
- 从集合取出对象时错误地强转为不相关类型
- 始终使用泛型声明集合类型,如List
- 避免混合使用泛型与原始类型操作同一集合
- 必要时使用instanceof判断类型再转型










