0

我得到了,java.util.ConcurrentModificationException但我需要弄清楚哪个班级给了我这个例外。该代码有许多类和包,很难找出错误来自哪里。异常显示ArrayList. 当我在可疑区域使用异常处理时,它不会捕获异常。

有什么出路吗?

4

5 回答 5

2

如果您使用的是现代 IDE,例如 eclipse,那么您可以在调试模式下运行应用程序并在任何异常上设置断点。效果:每次抛出异常时应用程序都会停止(在整个 JVM 中),并且您会获得堆栈跟踪。

这使得识别调用者(以及实际线程,如果它是一个并发问题)变得非常容易


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

那是坏人。这是paint您的JavaGroupLayer课程的方法。它可能有一个 for 循环遍历数组列表,并在某一时刻检测到该列表已被修改。

你在你的 Swing 应用程序中使用线程吗?在这种情况下,请仔细检查它们是否没有修改布局。

于 2012-03-07T14:20:31.583 回答
1

通常从堆栈跟踪的顶部开始,您编写/识别为您的第一个类应该是您的入口点。之后,您可能会在其他类/方法中进行调用,因此您可以跟踪堆栈跟踪,从而跟踪有问题的代码。

另外:您可能正在做的事情(我过去自己做过)正在尝试修改集合,同时对其进行迭代。这就是并发修改的意思。试着看看你在哪里做那应该是它。

于 2012-03-07T14:19:36.613 回答
1

从上到下遍历堆栈跟踪,属于您的源代码的第一个类是从ArrayList试图对其进行非法操作而收到异常的类。然后检查哪些线程同时访问该实例并使用方法或块ArrayList保护它。synchronizedsynchronized

于 2012-03-07T14:20:25.383 回答
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 不是多线程安全的,您试图在另一个线程中更改数据结构,而不是使用交换 AWT 线程。

于 2012-03-07T15:27:54.550 回答
0

识别列表,然后将迭代更改为使用列表迭代(对于 i=0; i < list.size(); i++)而不是迭代器迭代(对于 x:list)

或者,您可以制作列表的浅表副本并对其进行迭代。

于 2012-04-12T16:53:36.393 回答