调用ArrayList.clear()抛出ArrayIndexOutOfBoundsException的原因是什么
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=49; index=49 at java.util.ArrayList.clear(ArrayList.java:569)
上述异常在单线程正常使用标准JDK的ArrayList时几乎不会出现,常见触发原因如下:
- 多线程并发操作非线程安全的
ArrayList
这是该类异常最常见的根因。ArrayList本身不做任何线程同步保障,当一个线程执行clear()方法时,其他线程同时对该列表执行增删元素、触发列表扩容等操作,会导致ArrayList内部存储数组的实际长度、记录已存元素数量的size变量出现数据不同步:clear()内部会遍历0到size-1的下标将对应位置置空,如果此时size被其他线程修改为大于当前数组长度的值,就会触发数组越界。
修复建议:多线程场景下使用列表时,可选择用
Collections.synchronizedList()包裹ArrayList,或者直接使用线程安全的CopyOnWriteArrayList实现。
- 自定义
ArrayList子类的逻辑错误
如果项目中存在继承ArrayList重写内部逻辑的代码,或者引入的第三方库修改了ArrayList的内部实现,错误调整了内部数组、size变量的赋值逻辑,也会导致clear()执行时下标计算出错。 - 反序列化流程异常
如果该ArrayList实例是从自定义序列化流程中恢复生成的,反序列化过程出现错误会导致内部存储的size值和实际数组长度不匹配,例如size被错误赋值为超过数组长度的值,执行clear()时就会抛出该异常。 - 旧版本JDK的实现Bug
极少数低版本JDK的ArrayList内部实现存在逻辑漏洞,可能触发该异常,该场景概率极低,优先排查上述三类场景即可。
内容的提问来源于stack exchange,提问作者Balwinder SIngh
相关产品推荐
相关产品推荐

