2012-11-16 58 views
1

我正在嘗試創建一個簡單的BreakOut克隆,以使我熟悉LibGDX和scene2d。然而,在組裝一個非常基本的例子以讓我自己開始之後,我得到了一個非常明確定義的對象的NullPointerException。getX()調用的NullPointerException(Scene2d + Libgdx)

我有一個名爲Paddle的Actor類,它在我的程序中調用了一個實例,簡單地說就是paddle。它被聲明爲全局變量並在create()方法中初始化。當我運行該程序,它在我的渲染()在檢查代碼方法返回一個錯誤,如果槳是屏幕的範圍之外:

// make sure the paddle stays within the bounds of the screen 
if(paddle.getX() < 0) paddle.setX(0); // <--- error is detected here 
if(paddle.getX() > 800 - 200) paddle.setX(600); 

以下是錯誤返回:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.NullPointerException 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:111) 
Caused by: java.lang.NullPointerException 
    at com.freakout.Game.render(Game.java:150) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:190) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:108) 

這裏是Paddle類;

public class Paddle extends Actor { 
TextureRegion region; 
public Paddle(){ 
    region = new TextureRegion(new Texture(Gdx.files.internal("paddle.png")), 800/2 - 200 /2, 20); 
    } 
} 

Here's the code萬一它有助於看看整件事。

編輯:我找到了答案多虧了評論: 我意識到什麼posting-照顧像我重新定義了槳變量的範圍(通過使用槳槳=新槳(我已立即錯過... ))是本地方法而不是全局方法。因此,當它嘗試訪問該對象時,它總是返回null,因爲該對象在create()方法之外不可訪問。

如果您的演員在基本通話時無法正常工作,那可能是您的罪魁禍首。

+1

如何分配paddle變量? – matsev

+0

oi,哇。我正要粘貼實例並向您顯示,但我意識到我已經在創建時重新定義了paddle變量的範圍,因此它是本地的。不能相信我沒有聽到。感謝您的提醒。 – user1760501

回答

3

我已經通過您的代碼消失了,我發現你的create()方法您可以通過「new Paddle()」創造了一個槳並將其分配給在這一行「Paddle paddle = new Paddle();」局部變量「paddle」。所以實際上由於這個原因,Game類的名爲「paddle」的變量仍然未初始化(因爲被方法的局部變量隱藏)。因此,在您的render()方法中訪問它時,您會得到NullPointerException

爲了擺脫這個事情,只需將「Paddle paddle = new Paddle();」這一行改爲「paddle = new Paddle();」即可完成。

1

paddle變量被賦值爲null或未初始化。