当前位置: 首页 > news >正文

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

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

eptionHandler.handler(178): TXXYBUSSINESS|执行异常
java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0at 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 0at 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) ~[?:?]

具体代码:

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请求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() )最后输出结果.

分析:这种情况是多线程并发情况下添加数据ensureCapacity 这个方法是非线程安全的导致计算值扩容不够抛出的异常。
查看ArrayList源码:
在这里插入图片描述
解决方法:
1.使用官网提供的方法Collections.synchronizedList

  List list = Collections.synchronizedList(new ArrayList(...));

2.new一个对象CopyOnWriteArrayList方法

new CopyOnWriteArrayList<>()
http://www.lryc.cn/news/113449.html

相关文章:

  • 桶排序算法
  • P8604 [蓝桥杯 2013 国 C] 危险系数
  • Excel·VBA表格横向、纵向相互转换
  • Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】
  • LeetCode--HOT100题(22)
  • 产品体系架构202308版
  • Linux systemctl 简单介绍与使用
  • 恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游
  • Vue CORS
  • Godot 4 源码分析 - 文件读入编码处理
  • Linux 中使用 verdaccio 搭建私有npm 服务器
  • C++入门之stl六大组件--stack和queue源码深度剖析及模拟实现
  • MyCat配置文件schema.xml讲解
  • Grafana集成prometheus(2.Grafana安装)
  • 代码随想录算法训练营第五十七天| 647. 回文子串 516.最长回文子序列
  • django 优化方式
  • IDEA中怎么使用git下载项目到本地,通过URL克隆项目(giteegithub)
  • 09. Docker Compose
  • 如何在shell脚本将node_modules里的文件复制一份到public文件里
  • 监控Redis的关键指标
  • Openlayers和leaflet如何选用?
  • 跟我学C++中级篇——三五法则
  • aardio:用 WebView 模仿 mdict 界面
  • linq中的操作符
  • 数据结构【哈夫曼树】
  • SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接
  • deepspeed zero3
  • 代驾小程序怎么做
  • 探索 AJAX 技术:实现动态数据交互的前端利器
  • 深度学习Redis(3):主从复制