我得到了,java.util.ConcurrentModificationException
但我需要弄清楚哪个班级给了我这个例外。该代码有许多类和包,很难找出错误来自哪里。异常显示ArrayList
. 当我在可疑区域使用异常处理时,它不会捕获异常。
有什么出路吗?
我得到了,java.util.ConcurrentModificationException
但我需要弄清楚哪个班级给了我这个例外。该代码有许多类和包,很难找出错误来自哪里。异常显示ArrayList
. 当我在可疑区域使用异常处理时,它不会捕获异常。
有什么出路吗?
如果您使用的是现代 IDE,例如 eclipse,那么您可以在调试模式下运行应用程序并在任何异常上设置断点。效果:每次抛出异常时应用程序都会停止(在整个 JVM 中),并且您会获得堆栈跟踪。
这使得识别调用者(以及实际线程,如果它是一个并发问题)变得非常容易
playn.java.JavaGroupLayer.paint(JavaGroupLayer.java:96)
那是坏人。这是paint
您的JavaGroupLayer
课程的方法。它可能有一个 for 循环遍历数组列表,并在某一时刻检测到该列表已被修改。
你在你的 Swing 应用程序中使用线程吗?在这种情况下,请仔细检查它们是否没有修改布局。
通常从堆栈跟踪的顶部开始,您编写/识别为您的第一个类应该是您的入口点。之后,您可能会在其他类/方法中进行调用,因此您可以跟踪堆栈跟踪,从而跟踪有问题的代码。
另外:您可能正在做的事情(我过去自己做过)正在尝试修改集合,同时对其进行迭代。这就是并发修改的意思。试着看看你在哪里做那应该是它。
从上到下遍历堆栈跟踪,属于您的源代码的第一个类是从ArrayList
试图对其进行非法操作而收到异常的类。然后检查哪些线程同时访问该实例并使用方法或块ArrayList
保护它。synchronized
synchronized
一个常见的错误是丢弃异常,只读取消息或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 线程。
识别列表,然后将迭代更改为使用列表迭代(对于 i=0; i < list.size(); i++)而不是迭代器迭代(对于 x:list)
或者,您可以制作列表的浅表副本并对其进行迭代。