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