Wednesday, April 2, 2014

ConcurrentModificationException when you see nothing wrong in the code!

You may sometimes encounter exception such as ConcurrentModificationException and tried to look at the code with the given stacktrace and see nothing wrong. 

java.util.ConcurrentModificationException
 at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
 at java.util.HashMap$KeyIterator.next(Unknown Source)
 at c2.server.SessionManager.expireSessions(SessionManager.java:130)
 at c2.server.SessionExpiry.runThread(SessionExpiry.java:49)
 at c2.prm.IThreadAdmin.run(IThreadAdmin.java:276)

When you look at the code in SessionMager.expireSessions(), this is how it looks like:

                Set activeSessions = new HashSet();
                for (Iterator iterator = activeSessions.iterator(); iterator.hasNext();)
               {
                 Session session = (Session) iterator.next();

                 if (isSessionExpired(session))
                 {
                 activeSessions.remove(session);
                 }
             }

The exception is thrown in the highlighted line. On first look, were you able to pinpoint what's wrong in this code?

I admit. I didn't see what's wrong at first. I did a lot of research on google and tried few suggestions but nothing worked. My project is built on Java 1.3 therefore it's not easy to apply a fix especially if the code is not compatible.

After asking someone to have a second look and while explaining the situation, I finally realized what was wrong. It is the following line:

               activeSessions.remove(session);

So what it is trying to remove was an object from the collection itself!

By now you should have guessed the solution to this?

If you still haven't realized, the following is the solution.

                Set activeSessions = new HashSet();
                 for (Iterator iterator = activeSessions.iterator(); iterator.hasNext();)
                  {
                 Session session = (Session) iterator.next();
                
                 if (isSessionExpired(session))
                 {
                 iterator.remove();
                 }
                 }

Highlight to see the answer :)

No comments:

Post a Comment

AOL Directory Sumbit Url
Submit Site to Yahoo