前段时间做指标的修改时,遇到了一个问题:如果原指标中存在,现在要修改这个指标,将其删掉,会出先一个异常.有时可以删掉其中的一个,有时一个也删除不了.经过别人的指引,终于解决了,现在将一个问题写下来.
源程序:
PO中存放的时原指标.VO 中存放的时新指标.将PO VO 进行对比,由此决定操作
//branch 1: 删除PO中存在,VO中不存在的指标
for (Iterator i=indPOSet.iterator();i.hasNext();) {
mpiPO = (MarketPlanIndicatorPO)i.next();
isExist = false;
for (Iterator i2=indVOSet.iterator();i2.hasNext();) {
mpiVO = (MarketPlanIndicatorVO)i2.next();
if (null != mpiVO.getIndicatorId() && mpiVO.getIndicatorId().longValue() == mpiPO.getIndicatorId().longValue()) {
isExist = true;
break;
}
}
if (isExist) {
//如果指标还存在,更新指标
ObjectTranslate.transVO2PO(mpiVO,mpiPO);
} else {
//如果指标不存在,删除指标
indPOSet.remove(mpiPO);
}
}
问题在于indVOSet里的数据经过iterator()操作后Iterator i2只是存放indVOSe的一个引用,同理,indPOSet也是.这样当我们在删除mpiPO时,只是删除了迭代器i的一个引用,并没有真正的删除一个指标.当进行下一轮的比较时.删除引用的部位是指向一个空引用,因此会抛出一个异常.为了解决这个问题,就要防止空应用的比较.为此该用数据比较,而不是迭代器
修改后的源代码:
//branch 1: 删除PO中存在,VO中不存在的指标
MarketPlanIndicatorPO[] mpiPOArray = (MarketPlanIndicatorPO[])indPOSet.toArray(new MarketPlanIndicatorPO[0]);
for (int i=0;i<mpiPOArray.length;i++) {
mpiPO = (MarketPlanIndicatorPO)mpiPOArray[i];
isExist = false;
for (Iterator i2=indVOSet.iterator();i2.hasNext();) {
mpiVO = (MarketPlanIndicatorVO)i2.next();
if (null != mpiVO.getIndicatorId() && mpiVO.getIndicatorId().longValue() == mpiPO.getIndicatorId().longValue()) {
isExist = true;
break;
}
}
if (isExist) {
//如果指标还存在,更新指标
ObjectTranslate.transVO2PO(mpiVO,mpiPO);
} else {
//如果指标不存在,删除指标
indPOSet.remove(mpiPO);
}
}