Java 尝试绘制到画布时获取nullpointerexception错误

Java 尝试绘制到画布时获取nullpointerexception错误,java,Java,我试图通过使用2d阵列在屏幕上绘制棋盘格图案,并根据从阵列位置读取的字符在当前坐标处绘制10x10像素块。我认为这是所有与问题相关的代码: public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g; g.fillRect(0, 0, this.getWidth(),this.getHeight()); for(int x = 0;x

我试图通过使用2d阵列在屏幕上绘制棋盘格图案,并根据从阵列位置读取的字符在当前坐标处绘制10x10像素块。我认为这是所有与问题相关的代码:

public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g.fillRect(0, 0, this.getWidth(),this.getHeight());
        for(int x = 0;x<=3;x++){
            for(int y = 0;y<=3;y++){
                                // NPE occurs on this line:
                if (globalmap[x][y] == '1'){g2d.fillRect(10*y, 10*x, 10,10);}
            }
        }
}
堆栈跟踪:

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at com.side.side.GameEngine.paint(GameEngine.java:64)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        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.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(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)
第64行:

if (globalmap[x][y] == '1') { g2d.fillRect(10*y, 10*x, 10,10); }

很可能您的globalmap数组元素为空,但根据您发布的内容很难判断。请注意,这一行非常糟糕:

 if (globalmap[x][y] == '1'){g2d.fillRect(10*y, 10*x, 10,10);}
如果仅出于调试目的,您需要将其分散在几行上:

if (globalmap[x][y] == '1') {
    g2d.fillRect(10*y, 10*x, 10,10);
}

很可能您的globalmap数组元素为空,但根据您发布的内容很难判断。请注意,这一行非常糟糕:

 if (globalmap[x][y] == '1'){g2d.fillRect(10*y, 10*x, 10,10);}
如果仅出于调试目的,您需要将其分散在几行上:

if (globalmap[x][y] == '1') {
    g2d.fillRect(10*y, 10*x, 10,10);
}

... 第64行是哪一行?你确定globalmap不是空的吗?说真的,第64行是什么?你知道我们看不到你的监视器,对吗?那么哪个是
null
globalmap
还是
g2d
?我和纳瑞克在一起。您考虑过使用调试器吗?这不是您的问题,但是自定义绘制应该通过重写paintComponent()方法而不是paint()方法来完成。。。。第64行是哪一行?你确定globalmap不是空的吗?说真的,第64行是什么?你知道我们看不到你的监视器,对吗?那么哪个是
null
globalmap
还是
g2d
?我和纳瑞克在一起。您考虑过使用调试器吗?这不是您的问题,但是自定义绘制应该通过重写paintComponent()方法而不是paint()方法来完成。结果表明,为全局映射赋值的函数从未执行过。非常感谢你指出这一点,并帮助我纠正我的不良习惯。@purpleladydragons:啊哈,很高兴你能成功。对于这种类型的问题,我有时会在抛出NPE的行上方添加println语句,以查看错误,类似于
System.out.println(“globalmap为null:+(globalmap==null))
System.out.println(“globalmap[x][y]为空:+(globalmap[x][y]==null)),等等。。。这就是为什么println有时被称为“穷人的调试器”。您还可以使用大多数IDE的调试功能。结果表明,为全局映射赋值的函数从未执行过。非常感谢你指出这一点,并帮助我纠正我的不良习惯。@purpleladydragons:啊哈,很高兴你能成功。对于这种类型的问题,我有时会在抛出NPE的行上方添加println语句,以查看错误,类似于
System.out.println(“globalmap为null:+(globalmap==null))
System.out.println(“globalmap[x][y]为空:+(globalmap[x][y]==null)),等等。。。这就是为什么println有时被称为“穷人的调试器”。您还可以使用大多数IDE的调试功能。