如何避免这种情况的NullPointerException(How to avoid this Nu

2019-07-30 04:32发布

我工作的一小街机游戏机,我期待双重缓冲以提高动画。 我有一个是应该汲取的空白图像一类,并应该画一个简单的线条另一个类。 不过,我不断收到就行了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这是空的,但它得到的值dbImage.getGraphics();gameRender(); 我怎么能解决这个NullPointerException异常?

我还呼吁在这样的另一个类的draw()方法

    public void run() {

    running = true;

    while( running ) {

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

我在类的构造函数表示,设定MC = MC新();

Answer 1:

你打电话dbgthis的情况下,而不是实例render

您需要将其更改为

render.dbg.drawLine(....)

另外,如果你想离开dbg电话一样,你可以调用

this.gameRender();

第一,然后调用

dbg.drawLine(...);


Answer 2:

您设置dbg通过调用gameRenderrender ,但不是this



Answer 3:

由于MC扩展渲染中, dbg你指的是属于那个叫平局的MC实例。 你可以通过调用修复

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

或者趁你实现继承

class MC extends Render {
    //MC is a render, so you don't need to create another one
    public void draw() {
        gameRender(); //Call the MC's own gameRender
        dbg.drawLine( 100, 100, 200, 200 );  //Calling gameRender initialized dbg so you won't get a NullPointerException
    }
}


文章来源: How to avoid this NullPointerException