Stacktrace仅包含java库调用的异常

时间:2012-06-13 10:20:41

标签: java swing error-handling jtable stack-trace

如果错误的堆栈跟踪(主线程中没有发生)不包含任何方法,可以采取哪些可行的措施来找出问题所在? 有问题的完整痕迹:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

我当前正在尝试使用SwingWorker在后台运行一个进程,最后使用新数据更新JTable。 与此任务相关的所有代码都太大了,无法在此发布,我想知道是否有办法缩小错误来源。

5 个答案:

答案 0 :(得分:6)

堆栈跟踪可能不包含您的任何方法,但并不意味着它不包含您创建的任何对象。在这种情况下,问题很可能位于TableModel

为了调试这样的堆栈跟踪,我通常使用以下方法之一:

  • 做一些思考,你在哪里使用那些标准的JDK类,通过查看堆栈跟踪,你已经可以很好地了解出了什么问题(这个问题的答案可以看出,因为我们只有堆栈跟踪)
  • 在IDE中放置一个“异常断点”,它至少允许您使用调试器并获取更多信息,然后获取堆栈跟踪中可用的信息。可能会更容易识别您自己的对象,并在您的代码中找到问题所在的位置
  • 将JDK源代码附加到项目中,并在JDK源代码中放置常规断点,以便开始调试。
  • 而不是使用标准的JDK对象,例如常规JDK类的匿名扩展,只需调用super即可覆盖有问题的方法。这允许您在有问题的对象的有问题的方法中放置断点

这一切都归结为(除了第一种方法)相同:让我的调试器继续运行,这样我就可以更仔细地检查所有相关对象,以了解出了什么问题。一旦你理解了这个问题,修复它大部分时间都是微不足道的

答案 1 :(得分:5)

您的JTable(或您的新模型)没有列,当内部代码调用DefaultTableColumnModel.getColumn时会导致ArrayIndexOutOfBoundsException。

确保您的表格大小不是0。

答案 2 :(得分:2)

通常这些堆栈跟踪(Swing布局/绘制期间的NPE或IndexOutOfBounds,请参阅跟踪中的RepaintManager / Look& Feel类)是由于您未在EDT(事件分派线程)上创建/修改Swing组件引起的。 这包括更新像TableModel这样的Swing数据模型,它会触发将导致重绘的事件。

搜索“java swing并发教程”以获取更多信息。

答案 3 :(得分:0)

@Vulcan解决了您的具体问题。

通常,如果堆栈跟踪不涉及任何方法,请查找之前已经修改过的内容,以及现在由某个守护程序线程执行的内容。例如,在这种情况下,你搞砸了桌子,在绘图时,你没有使用任何方法,事情就在南方。

要查找的其他内容是无效的配置参数,无论是配置文件,命令行参数,环境变量等。

就是这样,如果你的方法没有导致错误,那么就是在事情搞砸之前发生的事情。

在非常罕见的情况下,当然,你可能会发现一个错误!

答案 4 :(得分:0)

您可以使用rt.jar调试java。*类,并配置IDE以允许跟踪和单步执行这些类。然后在堆栈跟踪的上层方法中放置一个断点,并尝试确定您对导致错误的可视组件做了什么。

或者只分析堆栈跟踪可以给出关于问题的提示,例如在这种情况下getColumn()有问题的行,所以应该对表列进行任何操作。索引0 >= 0为您提供有关预期或实际存在的列数的另一个提示。

通常,您需要深入了解组件的行为才能找出根本原因。