Как мы можем сказать, какой класс дает исключение - PullRequest
0 голосов
/ 07 марта 2012

Я получаю java.util.ConcurrentModificationException, но мне нужно выяснить, какой класс дает мне это исключение. В коде есть множество классов и пакетов, и сложно определить причину ошибки. Исключение показывает проблема ArrayList. Исключение не возникает, когда я использую обработку исключений в подозрительных областях.

Есть выход?

Ответы [ 5 ]

2 голосов
/ 07 марта 2012

Если вы используете современную среду IDE, например Eclipse, вы можете запустить приложение в режиме отладки и установить точку останова для любого исключения. С эффектом: приложение будет останавливаться каждый раз, когда генерируется исключение (во всей JVM), и вы получаете трассировку стека.

Это упрощает идентификацию вызывающей стороны (и фактического потока, если это проблема параллелизма)


playn.java.JavaGroupLayer.paint(JavaGroupLayer.java:96)

Это плохой парень. Это paint метод вашего JavaGroupLayer класса. Вероятно, он имеет цикл for, который перебирает список массивов, и в какой-то момент обнаруживает, что список был изменен.

Используете ли вы темы в вашем приложении Swing? В этом случае дважды убедитесь, что они не изменяют макет.

1 голос
/ 07 марта 2012

Пройдите трассировку стека сверху вниз, и первый класс, который принадлежит вашему исходному коду, - это тот, который получил исключение от ArrayList, пытающегося сделать с ним что-то недопустимое.Затем проверьте, какие потоки одновременно обращаются к этому экземпляру ArrayList, и защитите его с помощью synchronized методов или synchronized блоков.

1 голос
/ 07 марта 2012

Обычно начинаются с верхней части трассировки стека, и первый класс, который вы написали / опознали как свой, должен быть вашей точкой входа.После этого вы, вероятно, делаете вызовы в других классах / методах, поэтому вы можете следовать трассировке стека и, следовательно, нарушающему коду.

Дополнительно: то, что вы, вероятно, делаете (я делал это в прошлом), пытаетсяизменить коллекцию, перебирая ее.Это то, что означает одновременная модификация .Попробуй посмотреть, где ты это делаешь и должно быть.

0 голосов
/ 12 апреля 2012

Определите список, затем либо измените итерацию, чтобы использовать итерацию списка (для i = 0; i

Или вы можете сделать поверхностную копию списка и повторить ее.

0 голосов
/ 07 марта 2012

Распространенной ошибкой является отказ от исключения, только чтение сообщения или toString исключения.Если вы напечатаете трассировку стека, вы сможете точно определить, где (класс, метод и строка) каждого уровня стека.

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782)
 at java.util.ArrayList$Itr.next(ArrayList.java:754)
 at playn.java.JavaGroupLayer.paint(JavaGroupLayer.java:96)
 at playn.java.JavaPlatform$1.paint(JavaPlatform.java:222)
 at javax.swing.JComponent.paintToOffscreen(JComponent.java:5138)
 at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:‌​1454)
 at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1385)

В вашей среде IDE вы сможетенажмите на каждую строку, чтобы увидеть соответствующий код.

Учитывая, что это в пакете, более вероятно, что проблема в том, что вы использовали библиотеку неправильно.Похоже, что plyn не является многопоточным, и вы попытались изменить структуру данных в другом потоке вместо использования потока подкачки AWT.

...