问题缘由
在写强化耗材功能时,需要判断一个逻辑:如果消耗了材料导致背包中的该材料数量为0了,需要在背包中移除该材料。
在移除操作时,直接遍历了该HashMap集合移除了集合中的指定元素,一旦判定到材料数为0时,就会抛出异常。
/* 错误写法:一旦判定到材料数为0时,就会抛出异常。 */
for(IItem iItem:iItemMap.values()){
if(improveToxml:getItemId() == iItem.getItemId()){
if(iItem.getAmount() >= improveToxml.getAmount()){
iItem.setAmount(iItem.getAmount() - improveToxml.getAmount());
if(iItem.getAmount() == 0){
iItemMap.remove(iItem.getItemId());
}
}
else{
break;}
}
}
经了解,发现原因是Java的快速失败(fail-fast)机制,于是更改了代码写法,使用Iterator对象的remove()方法。
/* 修改写法:使用Iterator对象的remove()方法。 */
Iterator<iItem> it = iItemMap.values().iterator();
while(it.hadNext()){
IItem iItem = it.next;
if(iItem.getAmount() >= improveToxml.getAmount()){
iItem.setAmount(iItem.getAmount() - improveToxml.getAmount());
if(iItem.getAmount