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

青岛专业网站建设定制外贸网站推广

青岛专业网站建设定制,外贸网站推广,小程序后端数据库搭建,长沙seo制作目录 异常代码片段 详细说明 解决方案 使用迭代器进行遍历 使用临时集合存储结果 异常代码片段 if (ObjectUtil.isNotEmpty(candidateUsers)) {candidateUsers candidateUsers.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());for (String …

目录

异常代码片段

详细说明

解决方案

使用迭代器进行遍历

使用临时集合存储结果


异常代码片段

if (ObjectUtil.isNotEmpty(candidateUsers)) {candidateUsers = candidateUsers.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());for (String candidateUser : candidateUsers) {if (ObjectUtil.isNotEmpty(candidateUser) && candidateUser.contains("${")) {try {String expressionValue = expressionService.getStrValue(extendHisprocinst.getProcessInstanceId(), candidateUser);candidateUsers.add(expressionValue);} catch (Exception e) {log.error("解析人员报错,原因:{}", ExceptionUtil.stacktraceToString(e));}}}
}

这段代码中出现ConcurrentModificationException异常的原因是,在遍历candidateUsers集合的同时对其进行了修改。

具体来说,是在遍历过程中通过candidateUsers.add(expressionValue);向集合中添加元素,这会导致ConcurrentModificationException异常。

详细说明

详细解释

1.集合的遍历机制:

  • 当你使用for-each循环遍历集合时,实际上是在使用迭代器(Iterator)来遍历集合中的元素。

  • 迭代器在遍历集合时会维护一个内部计数器,以跟踪当前遍历的位置。

  • 每次调用next()方法时,迭代器会移动到下一个位置,并返回当前位置的元素。

2.并发修改检测:

  • Java集合框架中的许多集合类(如ArrayList)在遍历期间会检查集合是否被修改过。

  • 这种检查是通过一个称为modCount的字段来实现的,每当集合被修改时(例如添加或删除元素),modCount值就会增加。

  • 迭代器有一个expectedModCount字段,它在迭代器创建时被初始化为集合的modCount值。

  • 在每次调用next()方法时,迭代器会检查expectedModCount是否等于集合的当前modCount值。

  • 如果expectedModCount与当前modCount不匹配,说明集合在遍历过程中被修改过,这时迭代器会抛出ConcurrentModificationException异常。

代码分析

  • 在这段代码中,首先使用了流操作过滤并去重candidateUsers集合,然后遍历这个集合。
  • 在遍历过程中,如果满足某个条件(即candidateUser包含${),会尝试从expressionService获取表达式的值,并将其添加回candidateUsers集合中。
  • 这种做法违反了遍历过程中的并发修改规则,因此抛出了ConcurrentModificationException异常。

解决方案

为了避免这个问题,可以采用以下几种方法之一。

使用迭代器进行遍历

使用迭代器遍历集合,并在外部循环中处理元素,避免直接修改正在遍历的集合。

这种方法避免了直接修改正在遍历的集合,而是使用迭代器来安全地访问集合中的元素。

if (ObjectUtil.isNotEmpty(candidateUsers)) {candidateUsers = candidateUsers.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());Iterator<String> iterator = candidateUsers.iterator();while (iterator.hasNext()) {String candidateUser = iterator.next();if (ObjectUtil.isNotEmpty(candidateUser) && candidateUser.contains("${")) {try {String expressionValue = expressionService.getStrValue(extendHisprocinst.getProcessInstanceId(), candidateUser);candidateUsers.add(expressionValue);} catch (Exception e) {log.error("解析人员报错,原因:{}", ExceptionUtil.stacktraceToString(e));}}}
}
 
使用临时集合存储结果

创建一个新的集合来存储处理后的结果,而不是直接修改原始集合。从而避免了ConcurrentModificationException异常。

选择其中一种方法即可解决问题。如果需要保留原始集合的内容,建议使用第二种方法(使用临时集合存储结果)。

if (ObjectUtil.isNotEmpty(candidateUsers)) {List<String> tempCandidateUsers = new ArrayList<>();candidateUsers = candidateUsers.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());for (String candidateUser : candidateUsers) {if (ObjectUtil.isNotEmpty(candidateUser) && candidateUser.contains("${")) {try {String expressionValue = expressionService.getStrValue(extendHisprocinst.getProcessInstanceId(), candidateUser);tempCandidateUsers.add(expressionValue);} catch (Exception e) {log.error("解析人员报错,原因:{}", ExceptionUtil.stacktraceToString(e));}} else {tempCandidateUsers.add(candidateUser);}}candidateUsers = tempCandidateUsers;
}
​

http://www.15wanjia.com/news/47599.html

相关文章:

  • 网站建设发票属于 服务谷歌广告投放步骤
  • 网站建设服务费如何做会计分录自动连点器
  • dw做网站一般是多大的尺寸什么是软文推广
  • 宿州网站建设多少钱手机免费建网站
  • 会员制网站建设做网站公司哪家比较好
  • wordpress添加关键字郑州粒米seo外包
  • 长春网站制作允许吗百度网站排名关键词整站优化
  • 专做网站广西seo公司
  • 怎样宣传网站百度搜索链接
  • 营销型网站套餐武汉网站seo服务
  • 可以做立体图形的网站网站优化推广平台
  • 推广论坛有哪些北京seo外包 靠谱
  • 网站建设定制网站建设公司关键词搜索排名查询
  • 没有网站百度推广百度竞价推广开户多少钱
  • 房产中介网站开发模板杭州网站优化公司哪家好
  • 腾讯广告联盟seo推广优化培训
  • 做西点网站百度新闻发布平台
  • 网站建设的毕业设计报告好用的视频播放器app
  • 可以做日语翻译的兼职网站app优化方案
  • 个人做新闻网站处罚福州百度seo排名
  • 昆明网站做的好的公司域名收录查询
  • 做教育类的网站名百度竞价排名是以什么形式来计费的广告?
  • 做网站代理工作安全吗关键词优化营销
  • 杂志网站建设营销策划方案内容
  • 信誉比较好的网上做任务的网站优化师培训机构
  • 做网站在阿里云买什么软件深圳网络推广网站
  • 推广运营公司网站拉新注册app拿佣金
  • wordpress好用的企业展示主题今日头条seo
  • 国外作品集网站附近有学电脑培训班吗
  • 新疆生产建设兵团政府网站网络营销推广案例