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

Java 初始化非静态JPanel时偶尔出现nullpointerexception,java,swing,nullpointerexception,jpanel,paintcomponent,Java,Swing,Nullpointerexception,Jpanel,Paintcomponent,通常,我会因为不理解Java的基本方面而犯错误,但无论我做了多少研究,我似乎都无法找出这背后的问题 基本上,如果我初始化一些非静态的JPanels,或者任何扩展JPanel(或者JFrame)的类,那么我偶尔会得到一个java.lang.NullPointerException 即使我根本不使用面板&永远不要调用paintComponent方法一次,只是初始化面板的行为会导致异常,即使这样,也只是偶尔发生 这对我来说很奇怪,因为程序仍然绘制所有东西,没有任何可见的问题&我没有注意到任何故障。可能

通常,我会因为不理解Java的基本方面而犯错误,但无论我做了多少研究,我似乎都无法找出这背后的问题

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

即使我根本不使用面板&永远不要调用
paintComponent
方法一次,只是初始化面板的行为会导致异常,即使这样,也只是偶尔发生

这对我来说很奇怪,因为程序仍然绘制所有东西,没有任何可见的问题&我没有注意到任何故障。可能每六次或七次发生一次,当它发生时,它只发生在程序启动时,而不是在使用它的时候。 我觉得这与我不正确地设置了一个基本的GUI或其他东西有关&如果有人需要进一步解释代码的作用,我可以发布更多

这是我第一次在这里发布,所以我不确定要显示什么,但我注意到人们经常会包含错误消息,所以我将其包含在内。在错误消息中,它显示了类
SButton
Table
TableGrid
DelegateManager
鼠标
主面板
,以及
大型机
。这些是我编写的类,&我觉得
NullPointerException
可能存在于一些无法初始化的
Graphics
对象中。这只是猜测,真的

我认为错误在于,
mainFrame
,它扩展了
JFrame
,当调用
paintComponents(Graphics g)
方法时,将
g
发送到
mainPanel
,后者扩展了JPanel并使用其
paintComponent(Graphics g)
方法,然后将
g
发送到
Mouse
,它使用我定义的
draw(Graphics g)
方法,然后将
g
发送到
TableGrid
,它使用
draw(Graphics g g)
,将
g
发送到
Table
,它也有自己的
draw(Graphics g)
fill>(图形g)
方法,它扩展了
SButton
,还具有
绘制(图形g)
填充(图形g)
方法

每次向下传递
Graphics
对象时,接收它的类都会绘制一些东西,然后将其传递给下一个类。由于异常包括所有这些类以及我定义的绘制方法,我认为异常可能存在

当我不初始化非静态面板时,根本不会发生错误。我还初始化并使用了大约四个静态类,它们都扩展了
JPanel
,但它们似乎从未导致错误

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

问题甚至可能在于,&我只是看不到它。而且,重新绘制我称之为
repaint()的屏幕时可能会出现错误
大型机的方法,尽管我觉得这不应该是正确的,因为
JFrame
不是
JPanel
。它似乎可以工作,但我缺乏理解可能会导致我使用错误的重画方法。不过,如果我不初始化扩展
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)
如果需要更多的信息,我很乐意提供。不过现在,这是我所能想到的。如果有人能理解正在发生的事情,我将不胜感激

此外,如果我发布此问题的方式有误,请随时通知我。

您可以:

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

这里发生了什么:
SButton.java:82
?这是我最近读到的最令人困惑的问题之一……如果你能展示一下你的源代码目录
g
null
,这将大有帮助。那么,找出你为什么要在这里传递
null
。我会通过设置
NullPointerExcepti来解决这个问题在
@MadProgrammer上,有很多代码,到处都是,但我会看看是否可以在SSCCE中复制这个问题&我会发布它。