-1

可能重复:
如何避免此 NullPointerException

实际上我早些时候问过这个问题,但我不得不编辑它,我认为我为时已晚,因为在那之后没有人回答。

我正在开发一款小型街机视频游戏,并且我正在寻找双缓冲以改善动画效果。我有一个类应该绘制空白图像,另一个类应该绘制一条简单的线。但是,我一直在应该绘制线的线上收到 NullPointerException

class Render extends JPanel {
    public int dbWidth = 500, dbHeight = 400;
    public Image dbImage = null;
    public Graphics dbg;

    public void gameRender() {

        if( dbImage == null )  
            dbImage = createImage( dbWidth, dbHeight );

        dbg = dbImage.getGraphics();
        dbg.setColor( Color.white );
        dbg.fillRect( 0, 0, dbWidth, dbHeight );
    }
}

class MC extends Render {
    public Render render = new Render();

    public void draw() {
        render.gameRender();
        dbg.drawLine( 100, 100, 200, 200 ); // line where NullPointerException occurs
    }
}

我想是 Graphics 变量 dbg 为空,但它获得了dbImage.getGraphics();如何gameRender();修复此 NullPointerException?

我也在像这样的另一个类中调用 draw() 方法

    public void run() {

    running = true;

    while( running ) {

        mc.draw();
        try {
            Thread.sleep( 50 );
        }
        catch( Exception e ) {}
    }
}

我在那个类的构造函数中说过 mc = new MC();

4

3 回答 3

3

MC扩展类Render。这意味着MC继承Renderdbg字段。您不需要创建另一个Render. 试试这个:

class MC extends Render {

    public void draw() {
        super.gameRender();
        dbg.drawLine( 100, 100, 200, 200 ); // line where NullPointerException occurs
    }
}
于 2012-06-29T14:36:01.253 回答
1

你正在处理Render这里的两个实例:你的类中有一个render字段MC,并且由于MC它本身 extends Render,那里还有另一个隐式实例。当你这样做时:

render.gameRender();

您正在调用gameRender初始化的实例,render.dbg但是当您调用时,dbg.drawLine您正在使用尚未初始化MC的 s 实例。dbg

在这种情况下,你真的不需要继承,所以只需要render字段即可:

public void draw() {
    render.gameRender();
    render.dbg.drawLine( 100, 100, 200, 200 );
}

此外,公开字段也不是一个好习惯,因此请考虑为dbgin添加一个吸气剂Render

public Graphics getGraphics() {
    return dbg;
}

...

render.getGraphics().drawLine( 100, 100, 200, 200 );

或委托drawLine电话:

public void drawLine(int x1, int y1, int x2, int y2) {
    dbg.drawLine(x1, y1, x2, y2);
}

...

render.drawLine( 100, 100, 200, 200 );
于 2012-06-29T14:39:33.690 回答
0

我想在调用构造函数之前,java绘图环境会调用您的draw方法。

在构造函数中放置一个断点,在 draw() 中放置一个断点来验证这一点。

如果那是真的,只需在 draw 语句周围加上一个 if 来检查!= null。当然,这是一种解决方法,但也许对您有所帮助。

于 2012-06-29T14:40:00.150 回答