1
private void checkMaxPopularity() throws Exception {
    for (StoredArticle ckeckMax : monitorCombination.keySet()) {
        if (ckeckMax.getTimeAndPopularity().containsValue(5)) {
            monitorCombination.remove(ckeckMax);
            ReadXml newReadXml = new ReadXml();
            StoredArticle replaceArticle = getReplaceArticle();
            monitorCombination.put(replaceArticle, newReadXml);
            // System.out.print("TestTestTesttesttest");
        }
    }
}

Please help i am new in java and i want to iterate a hashmap in order to remove a pair of key and value. there is a if statement inside the for loop to check which value reaches 5 then it will be removed. But i got this exceptions:

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at uk.ac.ncl.fanyaoxia.monitor.MonitorRecentUpdates.checkMaxPopularity(MonitorRecentUpdates.java:138)
at uk.ac.ncl.fanyaoxia.monitor.MonitorRecentUpdates.continueMonitor(MonitorRecentUpdates.java:49)
at uk.ac.ncl.fanyaoxia.gui.MonitorRecentUpdatesGUI.actionPerformed(MonitorRecentUpdatesGUI.java:102)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6382)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6147)
at java.awt.Container.processEvent(Container.java:2083)
at java.awt.Component.dispatchEventImpl(Component.java:4744)
at java.awt.Container.dispatchEventImpl(Container.java:2141)
at java.awt.Component.dispatchEvent(Component.java:4572)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
at java.awt.Container.dispatchEventImpl(Container.java:2127)
at java.awt.Window.dispatchEventImpl(Window.java:2489)
at java.awt.Component.dispatchEvent(Component.java:4572)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:710)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:669)
at java.awt.EventQueue$2.run(EventQueue.java:667)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:683)
at java.awt.EventQueue$3.run(EventQueue.java:681)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:680)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
wadefanyaoxia
  • 573
  • 1
  • 8
  • 21
  • Take a look at: http://stackoverflow.com/questions/6092642/how-to-remove-a-key-from-hashmap-while-iterating-over-it – kiheru Jul 21 '13 at 11:13

1 Answers1

2

Problem is that you are using an iterator from monitorCombination.keySet(), which will throw that exception if you modify the content of the map (add or delete keys) while you are iterating on it. Try this instead:

private void checkMaxPopularity() throws Exception {
    for (StoredArticle ckeckMax : new HashSet<StoredArticle>(monitorCombination.keySet())) {
        if (ckeckMax.getTimeAndPopularity().containsValue(5)) {
            monitorCombination.remove(ckeckMax);
            ReadXml newReadXml = new ReadXml();
            StoredArticle replaceArticle = getReplaceArticle();
            monitorCombination.put(replaceArticle, newReadXml);
            // System.out.print("TestTestTesttesttest");
        }
    }
}

(the part that I changed is inside the for clause)

morgano
  • 16,937
  • 9
  • 46
  • 54