"
有如下代码:
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)
这个要怎么解决啊。。。
""
在迭代collection的时候不要修改collection,你自己都说了“//这个里面做了一下清空value的操作,然后就出了错误。”,所以不能这么干啊少年。
PS. 你的代码好乱,好好重构一下吧。
######谢邀!
以下代码
if (data != null) {
//这里是清空value
data.clear();
}
改成
if (data != null) {
//这里是清空value
data = null;
}
######
最简单的方法就是,边迭代边记录你要清空的 item.id ,迭代完之后再去清理
突然回想起这个问题,发现还是有一个很简单的方法可以解决这个异常,就是使用ConcurrentHashMap 来代替你的 HashMap,ConcurrentHashMap 支持边迭代边进行修改
"版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。