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