NullPointerException避免

时间:2012-06-29 14:32:59

标签: java inheritance nullpointerexception

  

可能重复:
  How to avoid this 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
    }
}

我想这是图形变量dbg是null,但它在dbImage.getGraphics();中得到gameRender();的值我怎么能解决这个NullPointerException?

我也在另一个类中调用draw()方法,比如

    public void run() {

    running = true;

    while( running ) {

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

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

3 个答案:

答案 0 :(得分:3)

MC扩展了类Render。这意味着MC会继承Render的{​​{1}}字段。您无需创建dbg的另一个实例。试试这个:

Render

答案 1 :(得分:1)

您在这里处理了Render的两个实例:render类中有一个MC字段,而且MC本身延伸Render ,那里有另一个隐含的例子。当你这样做时:

render.gameRender();

您在实例上调用gameRender,初始化render.dbg,但是当您致电dbg.drawLine时,您正在使用MC dbg的{​​{1}}实例尚未初始化。

在这种情况下,您确实不需要继承,因此只需render字段即可:

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

此外,将字段设为公开是不好的做法,因此请考虑在dbg中为Render添加一个getter:

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 );

答案 2 :(得分:0)

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

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

如果那是真的,只需用if来检查draw语句!= null。当然这是一种解决方法,但也许它可以帮到你。