2016-08-16 104 views
1

ConcurrentModificationException的我試圖從數組列表中刪除項目,但拋出ConcurrentModificationException的如何避免ArrayList中

listIterator = CustomListArr.iterator(); 
for (ClassA value : CustomListArr) { 
    try { 
     String query = "SELECT * FROM DEVICE_INFO WHERE DEV_IP='" + value.getaddress() + "'"; 
     String address = value.getiip(); 
     SQLiteDatabase db = dbController.getReadableDatabase(); 
     Cursor cursor1 = db.rawQuery(query, null); 

     if (cursor1 != null) { 
      if (cursor1.moveToFirst()) { 
       do { 
        while (listIterator.hasNext()) { 
         String ss = listIterator.next().getiip(); 
         if (ss.equals(ippaddress)) { 
          listIterator.remove(); 
         } else { 
          System.out.println(ss); 
         } 
        } 
        CustomHotspotListArr.size(); 
       } while (cursor1.moveToNext()); 
      } 
     } 
    } catch (Exception e) { 
     String error = e.toString(); 
    } 
} 
if (CustomListArr.size() > 1) { 
    list_adapter_configure = new CustomListview(Conf_devicelist.this, R.layout.conf_items, CustomListArr); 
    lv_configrue.setAdapter(list_adapter_configure); 
} else if (CustomListArr.size() == 1) { 
    startActivity(new Intent(getApplicationContext(), New_Activity.class)); 
    finish(); 
} else if (CustomListArr.size() == 0){ 
    Toast.makeText(Conf_devicelist.this, "No New Device Found", Toast.LENGTH_SHORT).show(); 
    Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
    startActivity(intent); 
    finish(); 
} 

回答

1

顯然,這種代碼創建一個迭代器(姑且稱之爲A):

 listIterator = CustomListArr.iterator(); 

但不很明顯,這段代碼還創建了一個迭代器(我們稱它爲B):

 for (ClassA value : CustomListArr) { 

所以發生了什麼事,當你用迭代器B遍歷CustomListArr時,你讀取了數據庫,然後開始用迭代器A遍歷CustomListArr。如果你用A去掉某些東西,然後回到迭代器B的循環,迭代器B注意到該名單已被更改後面並拋出ConcurrentModificationException

我看到CustomHotspotListArr的引用,所以我想知道是否有一個迭代器應該在這個列表中。

此代碼有很多問題。迭代器A是在開始時創建的,所以它永遠不會經過一次以上的列表。我甚至不知道這段代碼應該做些什麼,用特定的IP地址刪除列表中的所有項目,或者刪除重複項目。

+0

感謝您的回答。在CustomListArr中使用CopyOnWriteArrayList後,異常被清除。 –