繁体   English   中英

Stacktrace不包括我的课程。 我该怎么办?

[英]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,我只想知道可能是什么问题。 我需要能够将我引向正确方向的想法。 谢谢。

当发生这种情况时,这是一项艰巨的工作,但是您可以从两个地方开始:

  1. 首先,您可以查看GroupLayout的源代码,这表明问题所在的行可能是int x = horizontalSpring.getOrigin(); (这可能取决于您的JDK版本)。 这不是很有帮助,但这只是一个开始。 如果您看一下horizontalSpring的设置位置,一件事立即会引起注意:在dispose()方法中将其设置为null 因此,也许您的组件已被处置,这就是为什么您得到此错误。
  2. 其次,您可以放置​​一个异常断点,该异常断点将在引发NPE时停止执行。 然后,您可以检查确切为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,则它遵循insetshorizontalSpringverticalSpringcomponent中的一个(或多个)为null (如果我们确切知道引发异常的那条线,则可以将此范围缩小到一两种可能性。)

没有看到您的代码,很难做到这一点,但是我怀疑您构造GroupLayout的方式存在错误。

@biziclop关于更新的理论也是合理的。 Swing的组件数据结构不是线程安全的,并且不应由swing事件线程以外的任何其他线程更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM