Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          今日在調(diào)試程序時,出現(xiàn)了 java.util.ConcurrentModificationException,出錯代碼如下:

          for(Iterator ite = candidateObjDtoList.iterator(); ite.hasNext(); ) {
                 CandidateObjDto dto 
          = (CandidateObjDto)ite.next();
                 
          if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) {
                          dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);
                 }
           else {
                         candidateObjDtoList.remove(dto);        
                }

          }
                在網(wǎng)上搜索到資料如下:
          在Map或者Collection的時候,不要用它們的API直接修改集合的內(nèi)容,如果要修改可以用Iterator的remove()方法,例如:
              
          public void setReparation( Reparation reparation ) {
                  
          for (Iterator it = this.reparations.iterator();it.hasNext();){    //reparations為Collection
                      Reparation repa = (Reparation)it.next();
                      
          if (repa.getId() == reparation.getId()){
                          
          this.reparations.remove(repa);
                          
          this.reparations.add(reparation);
                      }

                  }

             }


          如上寫會在運行期報ConcurrentModificationException,可以如下修改:

              
          public void setReparation( Reparation reparation ) {
                  
          boolean flag = false;
                  
          for (Iterator it = this.reparations.iterator();it.hasNext();){    //reparations為Collection
                      Reparation repa = (Reparation)it.next();
                      
          if (repa.getId() == reparation.getId()){
                          it.remove();
                          flag 
          = true;
                          
          break;
                      }

                  }

                  
          if(flag){
                    
          this.reparations.add(reparation);
                  }

              }

               成功解決了所遇問題,成功后的代碼如下:
           
          for(Iterator ite = candidateObjDtoList.iterator(); ite.hasNext(); ) {
                  CandidateObjDto dto 
          = (CandidateObjDto)ite.next();
                  
          if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) {
                          dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);
          //對該候選項投棄權(quán)票
                  }
           else {
                           ite.remove();
                  }

          }
             
          posted on 2008-11-03 16:07 seal 閱讀(261) 評論(0)  編輯  收藏 所屬分類: Java基礎(chǔ)
          主站蜘蛛池模板: 江华| 宝坻区| 堆龙德庆县| 西丰县| 巫溪县| 山东省| 教育| 潍坊市| 仁布县| 民和| 肥东县| 临邑县| 乐东| 丹凤县| 罗山县| 集安市| 汉沽区| 偃师市| 浦江县| 镇江市| 安泽县| 新晃| 孝昌县| 广灵县| 老河口市| 上蔡县| 宽城| 靖安县| 安阳县| 广灵县| 龙口市| 柯坪县| 瑞金市| 临桂县| 五寨县| 海城市| 海宁市| 慈溪市| 大丰市| 东阿县| 芜湖市|