8

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

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。与此任务相关的所有代码都太大而无法在此处发布,我想知道是否有办法缩小错误来源。

4

5 回答 5

6

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

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

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

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

于 2012-06-13T10:31:52.190 回答
5

您的 JTable(或您的新模型)没有列,当内部代码调用DefaultTableColumnModel.getColumn.

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

于 2012-06-13T10:23:46.240 回答
2

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

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

于 2012-06-13T14:16:08.763 回答
0

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

通常,如果堆栈跟踪不涉及您的任何方法,请查找您之前修改过的东西,现在正在由某个守护线程执行。例如,在这种情况下,你把桌子弄乱了,在绘图时,没有使用你的任何方法,事情就向南了。

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

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

当然,在极少数情况下,您可能会发现错误!

于 2012-06-13T10:32:10.003 回答
0

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

或者,只有分析堆栈跟踪才能给出有关问题的提示,例如在这种情况下是getColumn()有问题的行,因此您对表格列所做的任何事情都应该如此。该索引0 >= 0为您提供有关预期或实际存在的列数的另一个提示。

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

于 2012-06-13T10:35:10.077 回答