2

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

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

即使我根本不使用面板并且从不调用该paintComponent方法一次,只是它们被初始化的行为会导致异常,即使这样它也只是偶尔发生。

这对我来说很奇怪,因为该程序仍然可以绘制所有内容而没有明显的问题,并且我没有注意到任何故障。可能每六到七次就会发生一次,并且当它发生时,它只会在程序启动时发生,而不会在使用它的过程中发生。

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

这是我第一次在这里发布,所以我不知道要显示什么,但我注意到人们经常包含错误消息,所以我已经包含了它。在错误消息中,它显示类SButtonTableTableGridDelegateManagerMousemainPanelmainFrame。这些是我编写的类,我觉得NullPointerException可能存在于某些Graphics无法初始化的对象中。这只是一个猜测,真的。

我认为错误在于mainFrame,它扩展JFrame,当paintComponents(Graphics g)方法被调用时,发送gmainPanel,它扩展 JPanel & 使用它的paintComponent(Graphics g)方法,然后发送gMouse,它使用一个draw(Graphics g)我定义的方法,然后发送gTableGrid,它使用draw(Graphics g),它发送gTable,它也有自己的draw(Graphics g)fill(Graphics g)方法,它扩展SButton,它也有一个draw(Graphics g)fill(Graphics g)方法。

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

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

此外,如果“传递”一个Graphics对象以便每个对象都可以根据它包含的属性在屏幕上绘制自己是一种可怕的程序制作方式,我深表歉意。我想不出另一种方法来做到这一点。

问题甚至可能在于,我只是看不到它。此外,重新绘制我称之为的屏幕可能会出现错误repaint()方法mainFrame,尽管我觉得这不应该是正确的,因为 aJFrame不是 a 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)

如果需要更多信息,我很乐意提供。不过,就目前而言,这就是我能想到的。如果有人能理解正在发生的事情,我将不胜感激。

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

4

1 回答 1

1

你可以:

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