麻烦解释java堆栈跟踪

时间:2014-08-13 16:09:08

标签: java indexoutofboundsexception

我有一个堆栈跟踪,我需要一些帮助解释:

java.lang.ArrayIndexOutOfBoundsException: 36 >= 36
    at java.util.Vector.elementAt(Vector.java:427)
    at javax.swing.tree.VariableHeightLayoutCache.getNode(VariableHeightLayoutCache.java:976)
    at javax.swing.tree.VariableHeightLayoutCache.getPreferredHeight(VariableHeightLayoutCache.java:274)
    at javax.swing.plaf.basic.BasicTreeUI.updateCachedPreferredSize(BasicTreeUI.java:1823)
    at javax.swing.plaf.basic.BasicTreeUI.getPreferredSize(BasicTreeUI.java:1924)
    at javax.swing.plaf.basic.BasicTreeUI.getPreferredSize(BasicTreeUI.java:1912)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1642)
    at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
    at java.awt.Container.layout(Container.java:1420)
    at java.awt.Container.doLayout(Container.java:1409)
    at java.awt.Container.validateTree(Container.java:1506)
    at java.awt.Container.validate(Container.java:1479)
    at javax.swing.RepaintManager$2.run(RepaintManager.java:698)
    at javax.swing.RepaintManager$2.run(RepaintManager.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:695)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1679)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:676)
    at java.awt.EventQueue$2.run(EventQueue.java:674)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:685)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

堆栈中的所有文件或函数都不适用于我的程序,所以通过我的计算,它必须是100%内部的swing。这并不是说它可能不是我的程序有问题。

我几乎可以理解当时JVM正在做的事情 - 看起来它正在重新绘制我在滚动窗格中的一个JTree组件(我有一些,所以我不知道它是什么可能是)。

我最好猜测可能导致此错误的原因是树的内容(以及因此其中的节点数)在重新绘制期间的某个时刻发生了变化,因此存储子节点的向量会发生变化,同时正在努力获得组件尺寸。

这听起来有道理吗?

如果是这样的话,我怎么能绕过它呢?我想我想在进行任何更新时阻止重新绘制,或者反过来在重新绘制时阻止更新?

1 个答案:

答案 0 :(得分:1)

正常的方式Swing"在更新过程中阻止重新绘制"是将UI的任何更改限制为事件派发线程;如果你不知道(或者程序作者没有/不知道)那是什么,那就表明他是问题的一部分。

错误信息(我偶然发现没什么有趣的)是说有一个向量(当编写Swing时没有出现泛型集合),其中包含36个元素,索引0-35;代码试图访问此向量的索引36,因此异常。

我会寻找在任何条件下都会发生变化的UI部分 - 是数据更改,窗口调整大小,是什么?向量有36个元素的事实应该会给你一些线索 - 你有一个地方有这么多类型的按钮,或者其他什么?我想它也可能是一个包含36个组件的窗口; UI是否有一个组件从窗口中消失的地方?

在同一个区域,我会寻找一些调用事件调度线程之外的类似paint或repaint的代码 - 所有这些代码都必须在该线程中完成。如果需要,请查看SwingUtilities.invokeAndWait()以获得一种方法,而无需使用现有代码。