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

阅读更多
文章标签: list iterator null
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭