2013-10-02 61 views
2

通常,我從我不理解Java的基本方面得到的錯誤,但無論我研究多少,我似乎都無法找出背後的問題。初始化非靜態JPanel時的偶然nullpointerexception

基本上,如果我初始化一個數非靜態JPanel S的,或延伸JPanel(或JFrame)任何類,那麼我偶爾獲得java.lang.NullPointerException

即使我不使用時面板的所有&從來沒有一次調用paintComponent方法,只是他們的行爲被初始化導致異常,甚至&然後它只是偶爾發生。

這對我來說很奇怪,因爲該程序仍然繪製一切都沒有明顯的問題,&沒有我已經注意到故障。也許每六七次發生一次,當它發生時,它只會在程序啓動時發生,而不會在使用它的過程中發生。

我覺得它不適合我設置一個基本的GUI不正確或什麼,&如果任何人需要進一步解釋什麼代碼我可以發佈更多。

這是我第一次在這裏發佈,所以我不知道要展示什麼,但我注意到人們經常包含錯誤消息,所以我已經包含了它。在錯誤消息中,它顯示類別SButton,Table,TableGrid,DelegateManager,Mouse,mainPanelmainFrame。這些是我編碼的類,&我覺得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,但它們似乎從來不會導致錯誤。另外,如果將某個對象「傳遞」下來,這樣每個對象都可以根據它所包含的屬性在屏幕上繪製自己,這對於製作程序來說是一種可怕的方式,對此我表示抱歉。我無法想出另一種方式來做到這一點。

問題甚至可能在於,&我只是看不到它。此外,可能會因爲重新繪製我稱爲mainFramerepaint()方法的屏幕而產生錯誤,儘管我覺得這應該是不對的,因爲JFrame不是JPanel。它似乎工作,但我缺乏理解可能導致我只是使用錯誤的重繪方法。不過,如果我不初始化擴展爲JPanelJFrame的非靜態對象,則不會發生錯誤。

總之,除了事實上,我只是真的很困惑,這裏是錯誤代碼:

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

這裏發生了什麼:'SButton.java:82'? – Kai

+5

這是我最近不得不閱讀的最混亂的問題之一...... [SSCCE](http://sscce.org/) – MadProgrammer

+2

顯示您的源代碼目錄 – 2013-10-02 07:23:55

回答

1

您可以:

  • 儘量使用斷點和Eclipse的調試模式。在那裏您將看到變量在斷點時的當前值。
  • 自己調試:打印出每個正在使用的對象。如果你在某個地方得到空位,你就知道你可能想看一看!