2012-11-16 55 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或未初始化。