2

通常、Javaの基本的な側面を理解していないためにエラーが発生しますが、いくら調べても、この問題の背後にある問題を見つけることができないようです。

基本的に、多数の非静的JPanels、または拡張JPanel(またはJFrame) する任意のクラスを初期化すると、ときどきjava.lang.NullPointerException.

パネルをまったく使用せず、paintComponentメソッドを一度も呼び出さない場合でも、初期化されるという行為だけで例外が発生し、それでもたまにしか発生しません。

プログラムはまだ目に見える問題なしにすべてを描画し、誤動作に気づいていないので、私には奇妙です。おそらく 6 ~ 7 回に 1 回はこのようなことが起こりますが、その場合は、プログラムの起動時にのみ発生し、使用中に発生することはありません。

基本的な GUI の設定が間違っているか何かに関係しているように感じます。コードの機能についてさらに説明が必要な場合は、さらに投稿できます。

ここに投稿するのは初めてなので何を表示すればよいかわかりませんが、エラー メッセージを含めている人が多いことに気付いたので、含めました。エラー メッセージには、クラス、、、、、、、およびが表示SButtonされます。これらは私がコーディングしたクラスであり、初期化に失敗したオブジェクトなどにあるように感じます。あくまでも推測です、本当に。TableTableGridDelegateManagerMousemainPanelmainFrameNullPointerExceptionGraphics

私がエラーがあると思う場所は、メソッドが呼び出されたときにmainFrame拡張する に送信し、JPanel を拡張してそのメソッドを使用し、次に送信し、定義したメソッドを使用し、次に送信し、使用するに送信し、独自のandメソッドも持ち、拡張し、 andメソッドも持ちます。JFramepaintComponents(Graphics g)gmainPanelpaintComponent(Graphics g)gMousedraw(Graphics g)gTableGriddraw(Graphics g)gTabledraw(Graphics g)fill(Graphics g)SButtondraw(Graphics g)fill(Graphics g)

オブジェクトが渡されるたびに、Graphicsそれを受け取ったクラスは何かを描画し、それを次のクラスに渡します。例外には、これらすべてのクラスと、私が定義した描画方法が含まれているため、そこに例外がある可能性があると思います。

非静的パネルを初期化しないと、エラーはまったく発生しません。また、すべてを拡張する約 4 つの静的クラスを初期化して使用しましJPanelたが、エラーが発生することはないようです。

また、オブジェクトを「受け渡し」て、Graphics各オブジェクトが含まれる属性に基づいて画面上に描画できるようにすることが、プログラムを作成するための恐ろしい方法である場合は、申し訳ありません。他に方法が思いつきませんでした。

問題はそこにあるかもしれませんが、私にはそれがわかりません。また、 a は aではないので、それは正しくないと感じますが、 のrepaint()メソッドを呼び出す画面を再描画するためにエラーが発生する可能性があります。うまくいくようですが、私の理解不足により、誤った再描画方法を使用している可能性があります。それでも、または拡張する非静的オブジェクトを初期化しなければ、エラーは発生しません。mainFrameJFrameJPanelJPanelJFrame

とにかく、私が本当に混乱しているという事実は別として、エラーコードは次のとおりです。

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 に答える