初始化非静态JPanel时偶尔会出现nullpointerexception

时间:2013-10-02 07:19:49

标签: java swing nullpointerexception jpanel paintcomponent

通常情况下,我从错误中了解Java的基本方面,但无论我研究多少,我都无法找到问题背后的问题。

基本上,如果我初始化了许多非静态JPanel或任何扩展JPanel(或JFrame)的类,那么我偶尔会得到java.lang.NullPointerException

即使我根本不使用面板也是如此从不调用paintComponent方法一次,只是初始化它们的行为导致异常,&即便如此,它偶尔也会发生。

这对我来说很奇怪,因为程序仍然会在没有明显问题的情况下绘制所有内容。没有什么我注意到的故障。也许每六到七次中就会发生一次,&当它发生时,它只在程序启动时发生,而不是在使用它的过程中。

我觉得这与我错误地设置基本GUI或其他东西有关,&如果有人需要进一步解释代码的作用,我可以发布更多内容。

这是我第一次在这里发布,所以我不确定要展示什么,但我注意到人们经常会包含错误消息,所以我已将其包含在内。在错误消息中,它显示了类SButtonTableTableGridDelegateManagerMousemainPanelmainFrame 。这些是我编码的类,&我觉得NullPointerException可能位于某个Graphics对象中,无法初始化或其他东西。真的,这只是猜测。

我认为错误在于mainFrameJFrame扩展paintComponents(Graphics g),当调用g方法时,mainPanel发送到paintComponent(Graphics g),它延伸了JPanel&使用g方法,然后将Mouse发送到draw(Graphics g)g使用我定义的TableGrid方法,然后将draw(Graphics g)发送到g },使用Tabledraw(Graphics g)发送到fill(Graphics g)SButton也有自己的draw(Graphics g)fill(Graphics g)方法,扩展Graphics,它还有JPanelGraphics方法。

每次向下传递repaint()对象时,接收它的类都会绘制一些东西,&然后把它传递给下一堂课。由于异常包括所有这些类,以及我定义的绘画方法,我认为异常可能就在那里。

当我不初始化非静态面板时,根本不会发生错误。我也初始化了&使用了大约四个静态类,它们都扩展mainFrame,但它们似乎永远不会导致错误。

此外,如果“传递”一个JFrame对象,这样每个对象可以根据它包含的属性在屏幕上绘制自己是制作程序的一种可怕方式,我道歉。我想不出另一种方法。

问题可能在于,&我只是看不到它。此外,重新绘制屏幕可能会出现错误我调用JPanel的{​​{1}}方法,即使我认为这不应该是正确的,因为JPanel是不是JFrame。它似乎有效,但我缺乏理解可能导致我只是使用错误的重绘方法。但是,如果我不初始化扩展Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at SButton.fill(SButton.java:82) at Table.fill(Table.java:8) at SButton.draw(SButton.java:75) at Table.draw(Table.java:49) at TableGrid.draw(TableGrid.java:74) at DelegateManager.draw(DelegateManager.java:66) at Mouse.draw(Mouse.java:61) at mainPanel.paintComponent(mainPanel.java:49) at javax.swing.JComponent.paint(JComponent.java:1037) at javax.swing.JComponent.paintChildren(JComponent.java:870) at javax.swing.JComponent.paint(JComponent.java:1046) at javax.swing.JComponent.paintChildren(JComponent.java:870) at javax.swing.JComponent.paint(JComponent.java:1046) at javax.swing.JLayeredPane.paint(JLayeredPane.java:567) at javax.swing.JComponent.paintChildren(JComponent.java:870) at javax.swing.JComponent.paint(JComponent.java:1046) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:34) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97) at java.awt.Container.paint(Container.java:1791) at java.awt.Window.paint(Window.java:3390) at javax.swing.RepaintManager$3.run(RepaintManager.java:836) at javax.swing.RepaintManager$3.run(RepaintManager.java:802) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:802) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:745) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:725) at javax.swing.RepaintManager.access$1000(RepaintManager.java:46) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680) 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) 或{{1}}的非静态对象,则不会发生错误。

无论如何,除了我真的很困惑之外,这里是错误代码:

{{1}}

如果需要更多信息,我很乐意提供。但就目前而言,这就是我所能想到的。如果有人能够理解正在发生的事情,我会非常感激。

另外,如果我发布此问题的方式做错了,请随时告诉我。

1 个答案:

答案 0 :(得分:1)

你可以:

  • 尝试使用断点和eclipse的调试模式。在那里,您将看到断点时变量的当前值
  • 自己调试:打印出正在使用的每个对象。如果你在某个地方得到null,你知道你可能想看看哪里!