我们如何判断哪个类给出了异常

时间:2012-03-07 14:16:51

标签: java exception exception-handling java.util.concurrent

我得到java.util.ConcurrentModificationException但是我需要找出哪个类给了我这个例外。代码有很多类和包,很难找出错误的来源。例外显示了ArrayList的问题。当我在可疑区域使用异常处理时,它不会捕获异常。

任何出路?

5 个答案:

答案 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)

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