Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Stacktrace不包括我的类。我该怎么办?_Java_Swing_Exception_Exception Handling_Stack Trace - Fatal编程技术网

Java Stacktrace不包括我的类。我该怎么办?

Java Stacktrace不包括我的类。我该怎么办?,java,swing,exception,exception-handling,stack-trace,Java,Swing,Exception,Exception Handling,Stack Trace,我正在开发一个Swing应用程序,它涉及很多类,大多数情况下都能正常工作,但有时会出现NullPointerException崩溃。在控制台中查看时,stacktrace不包括任何my类。因此,我无法找出问题的根源 以下是stacktrace: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.GroupLayout$ComponentInfo.setBounds(Gr

我正在开发一个Swing应用程序,它涉及很多类,大多数情况下都能正常工作,但有时会出现
NullPointerException
崩溃。在控制台中查看时,stacktrace不包括任何my类。因此,我无法找出问题的根源

以下是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,我只想知道问题出在哪里。我需要能为我指明正确方向的想法。
谢谢。

这是一项艰巨的工作,但你可以从两个地方开始:

  • 首先,您可以查看的源代码,这表明所讨论的行可能是
    intx=horizontalSpring.getOrigin()(这可能取决于您的JDK版本)。这不是很有帮助,但只是一个开始。如果查看
    horizontalSpring
    的设置位置,有一件事会立即突出:在
    dispose()
    方法中将其设置为
    null
    。因此,可能您的组件已经被释放,这就是为什么会出现错误
  • 其次,您可以放置一个异常断点,在抛出NPE时停止执行。然后,您可以检查什么是null,以及其他所有内容的值是什么。希望它也能给你一个关于为什么这个东西是空的线索,也许它会确认组件确实在这一点上被处理了

  • 另一个线索是,你说它大部分时间都有效。在绝大多数情况下,这意味着某种线程/同步问题,可能您正在从一个不是
    事件调度器的线程更新组件层次结构,这是一项艰巨的工作,但有两个地方可以开始:

  • 首先,您可以查看的源代码,这表明所讨论的行可能是
    intx=horizontalSpring.getOrigin()(这可能取决于您的JDK版本)。这不是很有帮助,但只是一个开始。如果查看
    horizontalSpring
    的设置位置,有一件事会立即突出:在
    dispose()
    方法中将其设置为
    null
    。因此,可能您的组件已经被释放,这就是为什么会出现错误
  • 其次,您可以放置一个异常断点,在抛出NPE时停止执行。然后,您可以检查什么是null,以及其他所有内容的值是什么。希望它也能给你一个关于为什么这个东西是空的线索,也许它会确认组件确实在这一点上被处理了

  • 另一个线索是,你说它大部分时间都有效。在绝大多数情况下,这意味着存在某种线程/同步问题,可能您正在从一个不是
    事件分派器的线程更新组件层次结构
    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,则表示
    插入项
    水平弹簧
    垂直弹簧
    组件
    中的一个(或多个)为
    。(如果我们准确地知道抛出异常的行,就有可能将其缩小到一到两种可能性。)

    在没有看到代码的情况下,更进一步是很困难的,但我怀疑您构建
    GroupLayout
    的方式中存在错误


    @比齐克洛普关于更新的理论也是可信的。Swing的组件数据结构不是线程安全的,不应由Swing事件线程以外的任何线程更新。

    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,则表示
    插入项
    水平弹簧
    垂直弹簧
    组件
    中的一个(或多个)为
    。(如果我们准确地知道抛出异常的行,就有可能将其缩小到一到两种可能性。)

    在没有看到代码的情况下,更进一步是很困难的,但我怀疑您构建
    GroupLayout
    的方式中存在错误


    @比齐克洛普关于更新的理论也是可信的。Swing的组件数据结构不是线程安全的,不应由Swing事件线程以外的任何线程更新。

    大多数情况下?另请参见。容器中是否有空组件?不,我不这么认为:@Sergey Lagutin-1。只提供NPE而不提供代码会让人们猜测问题。它对您和未来的访问者都没有帮助,可能会造成不必要的浪费您和其他人的时间。@dic19我使用了这么多包含数千行代码的类,异常甚至不能指示哪个类可以给我一个问题所在的线索。您想查看哪种代码?我怎么知道应该提供哪种代码?大多数情况下?另请参见。容器中是否有空组件?不,我不这么认为:@Sergey Lagutin-1。只提供NPE而不提供代码会让人们猜测问题。它对您和未来的访问者都没有帮助,可能会造成不必要的浪费您和其他人的时间。@dic19我使用了这么多包含数千行代码的类,异常甚至不能指示哪个类可以给我一个问题所在的线索。您想查看哪种代码?我怎么知道应该提供哪种代码呢?当你说“异常断点”时,你是指try-catch块吗?如果是,我应该把它放在哪里或哪一类?(现在我的stacktrace没有显示我的任何类)。@SamuelOkon没有,在Eclipse中(我猜在其他每个IDE中)可以添加一个异常断点(在Eclipse中,它是
    Run>addJava异常断点
    ),当指定类型的异常出现时,将触发该断点