1

我正在尝试创建一个简单的 BreakOut 克隆来熟悉 LibGDX 和 scene2d。但是,在组装了一个非常基本的示例以开始使用之后,我在一个定义非常明确的对象上得到了 NullPointerException。

我有一个名为 Paddle 的 Actor 类,它在我的程序中有一个名为 paddle 的实例。它被声明为全局变量并在 create() 方法中初始化。当我运行程序时,它会在代码中的 render() 方法中返回一个错误,用于检查桨是否超出屏幕边界:

// 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);
    }
}

这是代码,以防有助于查看整个内容。

编辑:感谢评论,我找到了答案:我意识到我在发布后立即错过了什么 - 看起来我重新定义了 paddle 变量的范围(通过使用 Paddle paddle = new Paddle(...))在本地方法而不是全局。因此,当它试图访问该对象时,它总是返回 null,因为该对象在 create() 方法之外是不可访问的。

如果您的 Actor 在基本调用中无法正常工作,这可能是您的罪魁祸首。

4

2 回答 2

3

我浏览了您的代码,发现在您的create()方法中,您通过“”创建了一个 Paddle,并将其分配给该行“”中new Paddle()的局部变量“ ”。所以实际上正因为如此,Game 类的名为“”的变量仍未初始化(因为被方法的局部变量隐藏)。因此,当在您的方法中访问它时,您会得到.paddlePaddle paddle = new Paddle();paddlerender()NullPointerException

要摆脱这个东西,只需将“ Paddle paddle = new Paddle();”这条线变成“ paddle = new Paddle();”,你就完成了。

于 2012-11-16T20:30:22.423 回答
1

paddle变量赋值为 null 或未初始化。

于 2012-11-16T20:16:47.427 回答