2

我正在一個小型街機視頻遊戲,我正在尋找雙緩衝區來改善動畫。我有一個班級應該畫空白圖像,另一個班級應該畫一條簡單的線條。不過,我一直在這裏行應該可以得出如何避免此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這是空行得到一個NullPointerException異常,但它得到的dbImage.getGraphics();值在gameRender();我怎麼能解決這個NullPointerException異常?

我也調用draw()方法在另一類這樣

public void run() { 

    running = true; 

    while(running) { 

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

我在類的構造函數表示,MC = MC新();

回答

6

您在this實例上調用dbg,而不是render的實例。

您需要將其更改爲

render.dbg.drawLine(....) 

另外,如果你想離開dbg電話一樣,你可以調用

this.gameRender(); 

,然後再調用

dbg.drawLine(...); 
+0

它仍然給了我一個空指針... – kullalok

+0

你是怎麼改變的繼承優勢? –

3

您通過調用gameRender在上設置,但不是this

1

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