"AWT-EventQueue-0" 空指针异常不一致错误消息



当我启动Java应用程序时,我得到这个错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at engine.Display.GamePanel.paintComponent(GamePanel.java:102)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1100(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

应用程序没有关闭,它让我正常运行它,没有视觉错误等,但我仍然得到这个错误信息有时当我启动应用程序。

它指向的唯一一段我自己的代码是GamePanel类中的第102行,这是我的paintComponent方法:

    @Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    //g.drawImage(test, picX, picY, picSizeX, picSizeY, null);
    mao.Draw(picX, picY, g);
}

在mao里面。我们有这个:

    public void Draw(int x, int y, Graphics g){
    Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(characterImage, x, y, null);
        g2d.drawRect(x, y, getWidth(), getHeight());
}

我已经修补了这个问题,但我似乎找不到错误。

错误是在gameppanel .java的第102行引起的,我认为是

  mao.Draw(picX, picY, g);

,因为mao尚未初始化,即在调用该方法时,其值为null。也许你的应用程序还没有完全初始化,但是GamePanel已经显示出来了。

您可以执行以下操作来检查是否为这种情况:

if (mao != null) {
    mao.Draw(picX, picY, g);
}

例外是paintComponent()方法中的NullPointerException

所以问题在那里,而不是在你的Draw()方法。在paintComponent()中,您访问mao标识符,我认为这是一个属性(GamePanel类)。

Swing中的所有绘制都是在EDT线程上完成的,我假设您初始化并设置了这个mao属性,而不是在EDT线程上=>这是一个同步问题。要么在EDT线程上分配mao属性,要么使其同步,以便访问它的多个线程正确地看到它的真实值。

您会遇到一次或少数情况下出现此异常,并且您的应用程序可以正常工作,因为只有paintComponent()将被终止,但是后续尝试绘制组件可能会成功(如果mao最终被EDT线程可见或同时被修改)。

最新更新