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
  • 597
  • 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
  • 17,210
  • 10
  • 45
  • 56
  • Thanks for the reply. but I got error which says: cannot convert from element type object to stored article. and for this for-loop of this hashmap I can success running in the previous method – wadefanyaoxia Jul 21 '13 at 11:13
  • Use generics: for(StoredArticle ckeckmax: new HashSet(monitorCombination.keySet())) – morgano Jul 21 '13 at 11:17
  • +1 because you're both removing and adding, you must iterate over a copy. If you were just removing you could use an iterator. – Bohemian Jul 21 '13 at 11:46