Caused by: java.util.ConcurrentModificationException: null

1、問題:

通過增強版得for循環

for(ColumnDefine c:columns){
                if(c.getHeader() == null){
                    columns.remove(c);
                }
            }

執行之後報Caused by: java.util.ConcurrentModificationException: null

 

經過查閱資料

ArrayListremove方法只是修改了modCount的值,並沒有修改expectedModCount,導致modCount和expectedModCount的值的不一致性,當next()時則拋出ConcurrentModificationException異常

因此使用Iterator遍歷集合時,不要改動被迭代的對象,可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護modCount和expectedModCount值的一致性。

 

2、修改方法

Iterator<ColumnDefine> iterator = columns.iterator();
while(iterator.hasNext()) {
    ColumnDefine c = iterator.next();
    if(c.getHeader() == null){
        iterator.remove();
    }
}

 

下面引用一段更專業的解釋:

Iterator 是工作在一個獨立的線程中,並且擁有一個 mutex 鎖。 Iterator 被創建之後會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往後移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章