Доброе утро, надеюсь получить помощь от кого-то, кто может знать немного больше о Java, чем я. Я пришел из .NET фона, и мне было поручено отследить проблему в поставляемом поставщиком решении. Я верю, что нашел это, но хотел бы второе, третье или четвертое мнение, если это возможно.
Что я думаю, что происходит, так это то, что строка номер 108 (указанная в блоке кода ниже) модифицирует Iterator (memIter), который был объявлен внешним по отношению к циклу while. Они модифицируют его, изменяя экземпляр, который был объявлен внутренним для цикла, а не исходный объект, и я верю, что он выбрасывает, потому что «next» вызывается на второй итерации в измененной коллекции / hastbale. На этом сайте я нашел несколько потоков, которые указывают на это (/506574/pochemu-vybrasyvaetsya-isklychenie-concurrentmodificationexception-i-kak-ego-otlazhivat), но потому, что он изменяет коллекцию (извините, если это термины .net) внутри коллекции (он удаляет члена из свойства hastable элемента в итератор) я бы предположил, что применима та же логика, но это не мое пространство. Также, если мое предположение верно, может ли кто-нибудь предоставить правильную реализацию?
STACK
java.util.ConcurrentModificationException
трассировки стека:
java.util.ConcurrentModificationException
в java.util.HashMap $ HashIterator.nextEntry (HashMap.java:793)
в java.util.HashMap $ ValueIterator.next (HashMap.java:822)
в xxx.xxxxx.xx.xxxxxxx.end (RoleOrganizer.java:108)
в (xxxxxxxxx.java:568)
в xxx.xxxx.xxxxxxx.handleRequest (xxxxHandler.java:74)
в com.xxxxx.server.JavaInstanceMethod.execute (JavaInstanceMethod.java:33)
в xx.xxxxxxx.execute (AppServer.java:1469)
в xxx.xx.executeRequest (xxxxxjava: 1269)
на xxx.xxxxx.server.xxxx.doGet (xxxxx.java:350)
на javax.servlet.http.HttpServlet.service (HttpServlet.java:690)
на javax.servlet.http.HttpServlet.service (HttpServlet.java:803)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290)
в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206)
в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:233)
в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:175)
в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:128)
в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109)
в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:286)
в org.apache.jk.server.JkCoyoteHandler.invoke (JkCoyoteHandler.java:190)
на org.apache.jk.common.HandlerRequest.invoke (HandlerRequest.java:283)
на org.apache.jk.common.ChannelSocket.invoke (ChannelSocket.java:767)
на org.apache.jk.common.ChannelSocket.processConnection (ChannelSocket.java:697)
в org.apache.jk.common.ChannelSocket $ SocketConnection.runIt (ChannelSocket.java:889)
в org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:690)
на java.lang.Thread.run (Thread.java:619)
Код ниже с номером строки ошибки стека 108
Строка 87
конец void ()
{
Iterator iter = new ArrayList(this.m_member.getRoles()).iterator();
while (iter.hasNext())
{
UserType rt = (UserType)iter.next();
if (!this.m_roleMap.containsKey(rt.getGID()))
{
this.m_member.removeRole(ut);
}
}
iter = this.m_roleMap.values().iterator();
Линия 99
while (iter.hasNext ())
{
UserType ut = (UserType)iter.next();
if (ut.isUnique())
{
Iterator memIter = this.m_member.doTask().lookUpMembers().iterator();
while (memIter.hasNext())
{
Линия 108
StoreMember mem = (StoreMember) memIter.next ();
if (mem.doWork() != this.m_member.getId())
{
if ((mem.hasRole(ut)) && (!mem.isFormer()))
{
mem.removeRole(ut);
}
}
}
}