日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么会出现 java.util.ConcurrentModificationException 异常?

發(fā)布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么会出现 java.util.ConcurrentModificationException 异常? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?http://www.iteye.com/topic/124788

在Map或者Collection的時候,不要用它們的API直接修改集合的內容(否則會出現(xiàn) java.util.ConcurrentModificationException 異常),如果要修改可以用Iterator的remove()方法,例如:

Java代碼 ?
  • ?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); ??
  • ?????????} ??
  • ?????} ??
  • }??
  • public void setReparation( Reparation reparation ) {for (Iterator it = this.reparations.iterator();it.hasNext();){ //reparations為CollectionReparation repa = (Reparation)it.next();if (repa.getId() == reparation.getId()){this.reparations.remove(repa);this.reparations.add(reparation);}}}


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

    Java代碼 ?
  • 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); ??
  • ????} ??
  • }??
  • public void setReparation( Reparation reparation ) {boolean flag = false;for (Iterator it = this.reparations.iterator();it.hasNext();){ //reparations為CollectionReparation repa = (Reparation)it.next();if (repa.getId() == reparation.getId()){it.remove();flag = true;break;}}if(flag){this.reparations.add(reparation);}}



    請問, 按照代碼一寫出現(xiàn)異常的原因是什么啊?
    為什么使用 Iterator來刪除集合里面的數(shù)據(jù)就沒有異常呢?

    引用 轉:ConcurrentModificationException主要原因及處理方法
    2007年04月18日 星期三 12:57
    當使用 fail-fast iterator 對 Collection 或 Map 進行迭代操作過程中嘗試直接修改 Collection / Map 的內容時,即使是在單線程下運行,?? java.util.ConcurrentModificationException 異常也將被拋出。

      Iterator 是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 Iterator 被創(chuàng)建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數(shù)量發(fā)生變化時,這個索引表的內容不會同步改變,所以當索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。

      所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。

      有意思的是如果你的 Collection / Map 對象實際只有一個元素的時候, ConcurrentModificationException 異常并不會被拋出。這也就是為什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

    1 import java.util.*;?
    2
    3 public final class MyTest?
    4 {?
    5 ??? private static HashMap p_mapList = new HashMap(2);?
    6 ??? private MyTest(){}?
    7 ??? public static void init(){?
    8 ??????? // If only there are more than one element in Map,?
    9 ??????? // the ConcurrentModificationException will not be
    10 ??????? // thrown.
    11 ???????? p_mapList.put(new String("hello"),new String("world"));?
    12 ???????? p_mapList.put(new String("goto"),new String("hell"));?
    13 ???? }?
    14 ??? public static void clear() throws Exception{?
    15 ???????? Iterator pTmpKeys = null;?
    16 ???????? Long pTmpKeyLong;?
    17 ???????? pTmpKeys = p_mapList.keySet().iterator();?
    18 ???????? String pCurKey = null;?
    19 ???????? String pCurObj = null;?
    20 ??????? while(pTmpKeys.hasNext()){?
    21 ???????????? pCurKey = (String) pTmpKeys.next();?
    22 ???????????? pCurObj = (String) p_mapList.get(pCurKey);?
    23
    24 ???????????? p_mapList.put(pCurKey,null);?
    25 ??????????? // You can not remove element in Map object directly.
    26 ??????????? //p_mapList.remove(pCurKey);
    27 ??????????? // But you can remove current element by iterator itself.
    28 ???????????? pTmpKeys.remove();?
    29
    30 ???????????? System.out.println(pCurKey + " removed.");?
    31 ???????? }?
    32 ???????? System.out.println(p_mapList.size() +??
    33 ??????????????????????????? " entries left after iterator.");?
    34 ???????? pTmpKeys = null;?
    35 ???? }?
    36 ??? public static void main(String[] args)?
    37 ???????????????????????????????? throws Exception{?
    38 ???????? MyTest.init();?
    39 ???????? MyTest.clear();?
    40 ???? }?
    41 }?

    ?

    總結

    以上是生活随笔為你收集整理的为什么会出现 java.util.ConcurrentModificationException 异常?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 伊人久久一区 | 亚洲男人天堂电影 | 五月天久久综合 | 亚洲久久在线观看 | 国产精品视频免费网站 | 青青草55| 国产精品一区二区6 | 狠色综合7777夜色撩人 | 亚洲国产精品自拍 | av色成人| 少妇被狂c下部羞羞漫画 | 日韩av一区二区在线播放 | 黄色视屏在线播放 | 久久不射影院 | 国产无套精品一区二区三区 | 少妇人妻偷人精品视频蜜桃 | 亚洲最大福利视频 | 黄色福利网 | 青青草视频网站 | 日韩成人专区 | 窝窝午夜看片 | 电影一区二区三区 | 美女扒开下面让男人捅 | 亚洲第一黄色 | 国产涩涩 | 玩弄人妻少妇500系列视频 | 国产精品理伦片 | 91丨九色丨蝌蚪丨老版 | 欧美 亚洲 另类 激情 另类 | 欧美呦呦 | 欧美激情免费在线观看 | 光棍影院手机版在线观看免费 | 91精品中文字幕 | 天天干少妇| 99re这里只有精品在线观看 | av片观看| 色窝av| 激情全身裸吻胸 | 欧美亚洲日本一区 | 欧美性猛交xxxx乱 | 青青草国产 | 日韩精品欧美激情 | 日中文字幕 | 毛片直接看 | 国语对白永久免费 | www.四色 | 欧美三级小说 | 午夜久久视频 | 插综合| 亚洲一级视频在线观看 | 国产资源精品 | 日韩精品一区二区三区在线视频 | 四虎影院一区 | 午夜av免费观看 | av作品在线| 激情五月视频 | 亚洲精品1234 | 人人精品久久 | 根深蒂固在线观看 | 网站黄在线 | 亚洲精品理论片 | 91碰在线视频 | 波多野结衣一区二区三区四区 | 天堂av资源在线观看 | 免费久久视频 | 亚洲第一色视频 | 超碰超碰在线 | 爱爱视频在线播放 | 高清视频免费在线观看 | av男女 | www.com久久 | 欧美日韩欧美 | 成人a视频在线观看 | 深夜福利一区二区三区 | 亚洲午夜精品一区二区三区他趣 | 精品影视一区二区 | 国产日韩免费视频 | 少妇高潮一区二区三区99欧美 | 国产精品伊人久久 | 国产精品免费av | 夜夜嗨av一区二区三区免费区 | 日日爱886| 综合人人| 国产一区免费 | 2021亚洲天堂 | 欧美成人资源 | 欧美日韩在线视频 | www三级| 久久av中文字幕 | 免费无遮挡在线观看视频网站 | 激情综合久久 | 夜夜爽影院 | 亚洲高清视频免费观看 | 婷婷九九| 美女的奶胸大爽爽大片 | 色之久久综合 | 九七av | 久久久久久久久久久久久久免费看 | 国产精品免费一区二区三区四区 |