如果错误的堆栈跟踪(主线程中没有发生)不包含任何方法,可以采取哪些可行的措施来找出问题所在? 有问题的完整痕迹:
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。 与此任务相关的所有代码都太大了,无法在此发布,我想知道是否有办法缩小错误来源。
答案 0 :(得分:6)
堆栈跟踪可能不包含您的任何方法,但并不意味着它不包含您创建的任何对象。在这种情况下,问题很可能位于TableModel
。
为了调试这样的堆栈跟踪,我通常使用以下方法之一:
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
为您提供有关预期或实际存在的列数的另一个提示。
通常,您需要深入了解组件的行为才能找出根本原因。