Java Stacktrace不包括我的类。我该怎么办?
我正在开发一个Swing应用程序,它涉及很多类,大多数情况下都能正常工作,但有时会出现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
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
。因此,可能您的组件已经被释放,这就是为什么会出现错误
另一个线索是,你说它大部分时间都有效。在绝大多数情况下,这意味着某种线程/同步问题,可能您正在从一个不是
事件调度器的线程更新组件层次结构,这是一项艰巨的工作,但有两个地方可以开始:
首先,您可以查看的源代码,这表明所讨论的行可能是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异常断点
),当指定类型的异常出现时,将触发该断点