SET LIST 等向迭代器转换时,迭代器时指向的引用

前段时间做指标的修改时,遇到了一个问题:如果原指标中存在,现在要修改这个指标,将其删掉,会出先一个异常.有时可以删掉其中的一个,有时一个也删除不了.经过别人的指引,终于解决了,现在将一个问题写下来.

 源程序:

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);
     }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值