[英]Stacktrace does not include my class. What should I do?
我正在开发一个涉及许多类的Swing应用程序,大多数情况下它都能工作,而有时它会崩溃,并NullPointerException
。 在控制台中查看时,stacktrace不包含我的任何类。 因此,我不知道问题的根源在哪里。
这是堆栈跟踪:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.GroupLayout$ComponentInfo.setBounds(GroupLayout.java:3657)
at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:928)
at java.awt.Container.layout(Container.java:1508)
at java.awt.Container.doLayout(Container.java:1497)
at java.awt.Container.validateTree(Container.java:1693)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validateTree(Container.java:1702)
at java.awt.Container.validate(Container.java:1628)
at javax.swing.RepaintManager$2.run(RepaintManager.java:691)
at javax.swing.RepaintManager$2.run(RepaintManager.java:689)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:688)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1679)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
基于stacktrace,我只想知道可能是什么问题。 我需要能够将我引向正确方向的想法。 谢谢。
当发生这种情况时,这是一项艰巨的工作,但是您可以从两个地方开始:
GroupLayout
的源代码,这表明问题所在的行可能是int x = horizontalSpring.getOrigin();
(这可能取决于您的JDK版本)。 这不是很有帮助,但这只是一个开始。 如果您看一下horizontalSpring
的设置位置,一件事立即会引起注意:在dispose()
方法中将其设置为null
。 因此,也许您的组件已被处置,这就是为什么您得到此错误。 另一个线索是,您说它大部分时间都有效 。 在大多数情况下,这意味着某种线程/同步问题,也许您是从不是Event Dispatcher
的线程更新组件层次结构的。
javax.swing.GroupLayout.ComponentInfo.setBounds
方法的代码如下:
public void setBounds(Insets insets, int parentWidth, boolean ltr) {
int x = horizontalSpring.getOrigin();
int w = horizontalSpring.getSize();
int y = verticalSpring.getOrigin();
int h = verticalSpring.getSize();
if (!ltr) {
x = parentWidth - x - w;
}
component.setBounds(x + insets.left, y + insets.top, w, h);
}
如果通过该方法抛出NPE,则它遵循insets
, horizontalSpring
, verticalSpring
或component
中的一个(或多个)为null
。 (如果我们确切地知道引发异常的那条线,则可以将此范围缩小到一两种可能性。)
没有看到您的代码,很难做到这一点,但是我怀疑您构造GroupLayout
的方式存在错误。
@biziclop关于更新的理论也是合理的。 Swing的组件数据结构不是线程安全的,并且不应由swing事件线程以外的任何其他线程更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.