-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
    }
}

null の Graphics 変数 dbg だと思いますが、この NullPointerException を修正するにdbImage.getGraphics();gameRender();どうすればよいですか?

このような別のクラスで 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継承します。の別のインスタンスを作成する必要はありません。代わりにこれを試してください:RenderdbgRender

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

Renderhereの 2 つのインスタンスを扱っています。クラスにはrenderフィールドがあり、それ自体 extendsであるため、別の暗黙のインスタンスがあります。あなたがするとき:MCMCRender

render.gameRender();

gameRenderを初期化するインスタンスを呼び出していますがrender.dbg、呼び出すときに、まだ初期化されていないインスタンスをdbg.drawLine使用しています。MCdbg

この場合、継承は本当に必要ないので、renderフィールドだけで十分です。

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

また、フィールドを公開するのは良い習慣ではないため、dbginの getter を追加することを検討して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描画環境によって呼び出されると思います。

これを確認するには、コンストラクター内に 1 つのブレークポイントを配置し、draw() 内に 1 つのブレークポイントを配置します。

そうである場合は、draw ステートメントを if で囲むだけで != null をチェックできます。もちろんそれは回避策ですが、多分それはあなたを助けるでしょう.

于 2012-06-29T14:40:00.150 に答える