List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

1.应用场景,今天生产日志监控到一组new ArrayList() 进行add 异常,具体日志如下:

java 复制代码
eptionHandler.handler(178): TXXYBUSSINESS|执行异常
java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1807) ~[?:?]
	at com.txxy.common.support.ThreadContextTaskDecorator.lambda$decorate$0(ThreadContextTaskDecorator.java:20) ~[txxy-common.jar:10.3.10-SNAPSHOT]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0
	at java.util.ArrayList.add(ArrayList.java:455) ~[?:?]
	at java.util.ArrayList.add(ArrayList.java:467) ~[?:?]
	at com.txxy.api.support.PersonalRiskReportSupport.lambda$riskType4$28(PersonalRiskReportSupport.java:528) ~[classes/:?]
	at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?]

具体代码:

java 复制代码
List<DTO> riskSummaryList = new ArrayList<>();
                        // 10条记录批量查询
                        Lists.partition(ids, Paging.DEF_PAGE_SIZE).forEach(arrIds -> {
                            List<CompletableFuture<Void>> list =
                                arrIds.stream().map(id -> CompletableFuture.runAsync(() -> {
                                    try {
                                     // ....代码省略了http请求 得到的responseDetail 结果集
                                       
                                        if (responseDetail.isSuccess()) {
                                            riskSummaryList.add(new DTO() );
                                        }
                                    } catch (TxxyBusinessException e) {
                                      
                                    }
                                }, apiTaskExecutor)).collect(Collectors.toList());
                            list.stream().map(CompletableFuture::join).collect(Collectors.toList());

                        });

                        result.setRiskSummaryList(riskSummaryList);

上面代码是对ids 分片按照10条记录查询远程接口,并将结果集放到list riskSummaryList 对象中 riskSummaryList.add(new DTO() )最后输出结果,代码比较简单.

分析:这种情况属于多线程并发产生的,ArrayList是一个非线程安全对象,在并发操作同一个对象时就可能出现上面的异常 情况,ArrayList 源码中ensureCapacity 这个方法是非线程安全的导致计算值扩容不够抛出的异常。

查看ArrayList 源码:

解决方法:

1.使用官网提供的方法Collections.synchronizedList

java 复制代码
  List list = Collections.synchronizedList(new ArrayList(...));

2.new一个对象CopyOnWriteArrayList方法

java 复制代码
new CopyOnWriteArrayList<>()

最后希望能帮助到你解决问题,或是评论区留言问题进行讨论~

相关推荐
路长冬2 分钟前
python基本语法
python
superman超哥5 分钟前
仓颉语言中错误恢复策略的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
海上飞猪23 分钟前
【Python基础】python判空
python
梦幻精灵_cq1 小时前
Linux.date格式化标识“制作”极简台历 vs Python.datetime.strftime格式化“精美”日历牌(时间工具依情境选择也是一种“智慧)
linux·python
ASS-ASH1 小时前
视觉语言大模型Qwen3-VL-8B-Instruct概述
人工智能·python·llm·多模态·qwen·视觉语言模型·vlm
再__努力1点1 小时前
【77】积分图像:快速计算矩形区域和核心逻辑
开发语言·图像处理·人工智能·python·算法·计算机视觉
matlabgoodboy1 小时前
程序代做python代编程matlab代码设计plc深度学习java编写C++代写
python·深度学习·matlab
席万里2 小时前
基于Flask框架实现的一个在线考试系统
后端·python·flask
Algebraaaaa2 小时前
为什么线程阻塞要用.join而不是.wait
java·c++·python
起风了___2 小时前
Python 批量发邮件脚本:Excel 名单 + Jinja2 模板,带日志与防限流,163 邮箱实测可用
python·程序员