HashMap上的ConcurrentModificationException(不迭代它)

时间:2017-05-25 01:49:49

标签: android hashmap concurrentmodification

我在尝试从HashMap中删除条目时遇到ConcurrentModificationException而我无法弄清楚原因。我迭代它,我只是检查它是否包含给定的密钥并删除映射到它的值(如果有的话)。我已经阅读过这方面的问题,但是所有人都试图在不使用迭代器的情况下迭代它来修改HashMap,这不是我的情况。

这是代码

    serverTasksNotInDB = CompareLists.serverTasksNotInDB(localTasks, serverTasks);
    if (serverTasksNotInDB != null && !serverTasksNotInDB.isEmpty()) {
       for (Task serverTask : serverTasksNotInDB) {
          String id = serverTask.getId();
          mPresenter.addTaskFirstTimeFromServer(serverTask, currentListId);
          if (serverTasks != null) {
             serverTasks.remove(serverTask);
             boolean containsKey = serverTasksMap.containsKey(id);
             if (containsKey) {
                //TODO Fix concurrency modification exception here (down)
                serverTasksMap.remove(id);
             }
          }
       }
    }

1 个答案:

答案 0 :(得分:0)

for(Task serverTask:serverTasksNotInDB)

实际上serverTasksNotInDB ArrayList调用iterator()方法。

foreach Api说明。

失败快速操作会在尽力而为的基础上抛出ConcurrentModificationException。因此,编写依赖于此异常的程序的正确性是错误的:ConcurrentModificationException应该仅用于检测错误。