2012-03-07 2 views
0

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

Любой выход?

+3

Stacktrace? Может быть? –

+4

У вас нет stacktrace? – talnicolas

+0

Было бы более полезно, если бы вы разместили свой код и трассировку стека исключений. Это почти наверняка «ConcurrentModificationException», вызванное модификацией коллекции во время ее повторения. –

ответ

2

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

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


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

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

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

+0

Я использую Eclipse. Я получаю трассировку стека. Я скопировал его как комментарий выше. посмотрите пожалуйста. Трассировка начинается с ArrayList.java Мне нужно выяснить, какой класс моего кода дает проблему. – Rockcollins

+0

Спасибо. Это действительно поможет мне. – Rockcollins

+0

Обновлено! Я не читал stacktrace правильно. Простите за это. Теперь я называю правильный класс. –

1

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

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

+0

На самом деле это не показывает классы моего кода в качестве точки входа. Он начинается с ArrayList.java. см. приведенный выше комментарий для моего описания ошибки. – Rockcollins

+0

Хмм, возможно, вы используете JavaGroupLayer? или что-то в PlayN? Это может быть ошибка в библиотеке или неправильное использование. Если это все трассировка стека, то, конечно, сложно понять. Возможно, отправьте его в список рассылки PlayN и посмотрите, знает ли кто-нибудь об этом – Nasir

+0

Спасибо .. Это действительно помогает. – Rockcollins

1

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

+0

Он не показывает классы, принадлежащие моему исходному коду. трассировка начинается с ArrayList.java – Rockcollins

0

Общей ошибкой является отказ от исключения, только чтение сообщения или 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 не является многопоточным, и вы попытались изменить структуру данных в другом потоке вместо использования swap AWT-потока.

0

Определить список, а затем либо изменить итерацию использовать список итерации (при г = 0; я < list.size(); я ++), а не итератор итерации (для й: список)

Или вы можете сделайте мелкую копию списка и повторите это.