开发者社区> 问答> 正文

java.util.ConcurrentModificationException报错

"

有如下代码:

protected void itemControlForDocumentUpload(SmartCabinet cabinet, Map<String, List<?>> itemControlMap, DataRecordImpl dataRecord) throws Exception { if (dataRecord != null) { for (Integer itemId : dataRecord.getItemIdList()) { //这个里面做了一下清空value的操作,然后就出了错误。 ((AbstractFormItemData) dataRecord.getData(itemId)).itemControlUploadCheck(itemControlMap, dataRecord, cabinet); } } }

itemControlUploadCheck()方法如下:

public void itemControlUploadCheck(Map<String, List<?>> itemControlMap, DataRecordImpl dataRecord,
            SmartCabinet cabinet)
            throws Exception {
        setItemControlFlag(cabinet, itemControlMap);
        
        if (this.isInHiddenBlock()) {

            //这里是清空value的方法
            clearItemsValue(cabinet, itemControlMap, dataRecord);

清空value的方法如下:

public void clearItemsValue(SmartCabinet cabinet, Map<String, List<?>> itemControlMap,
            DataRecordImpl dataRecord) throws Exception {

        if (((AbstractFormItem) cabinet.getForm().findItem(this.itemId)).getBlock() != null) {
            int blockId = ((AbstractFormItem) cabinet.getForm().findItem(this.itemId)).getBlock().getId();
            List<Integer> hideBlockIdList = (List<Integer>) itemControlMap.get("hide");
            if (hideBlockIdList != null && hideBlockIdList.size() > 0) {
                for (int i = 0; i < hideBlockIdList.size(); i++) {
                    if (hideBlockIdList.get(i).equals(blockId)) {
                        FormBlock block = cabinet.getForm().getBlockList().getBlock(blockId);
                        for (FormItem item : block.getFormItems()) {
                            AbstractFormItemData data = ((AbstractFormItemData) dataRecord
                                    .getData(item.getId()));
                            if (data != null) {
                                //这里是清空value
                                data.clear();
                            }
                        }
                    }
                }
            }
        }

    }

清空完vlaue之后,返回到第一个函数注释那块,就报错误了,错误如下:

java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
    at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
    at jp.co.dreamarts.insuite.brd.action.DocumentAction.itemControlForDocumentUpload(DocumentAction.java:4561)
    at jp.co.dreamarts.insuite.brd.action.DocumentAction.doUpdate(DocumentAction.java:1389)
    at jp.co.dreamarts.hibiki.smartdb.struts.DispatchingDocumentAction.doUpdate(DispatchingDocumentAction.java:47)
    at jp.co.dreamarts.insuite.brd.action.DocumentAction.doUpdate(DocumentAction.java:1305)

这个要怎么解决啊。。。

"

展开
收起
因为相信,所以看见。 2020-05-27 10:02:59 1216 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

    "

    在迭代collection的时候不要修改collection,你自己都说了“//这个里面做了一下清空value的操作,然后就出了错误。”,所以不能这么干啊少年。

    PS. 你的代码好乱,好好重构一下吧。

    ######

    谢邀!
    以下代码

        if (data != null) {
            //这里是清空value
            data.clear();
        }

    改成

        if (data != null) {
            //这里是清空value
            data = null;
        }
    ######

    最简单的方法就是,边迭代边记录你要清空的 item.id ,迭代完之后再去清理

    突然回想起这个问题,发现还是有一个很简单的方法可以解决这个异常,就是使用ConcurrentHashMap 来代替你的 HashMap,ConcurrentHashMap 支持边迭代边进行修改

    "
    2020-05-27 17:34:09
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载