Android游戏开发 - NullPointerException声明新对象后(构造函数没有做我想做的事)

时间:2011-07-27 23:13:29

标签: android nullpointerexception libgdx

我目前正在使用名为libgdx的框架学习游戏编程。它允许用户制作可以在桌面上的Java虚拟机和Android手机上轻松运行的程序。我正在尝试制作一个基本程序,它将在屏幕上显示一个字符,并允许我使用键盘来回移动它。我创建了3个类 - 一个名为Assets,它将文件加载到内存中并将它们转换为纹理和动画,一个名为InputHandler,通过更改动画,移动方向等来响应键输入。 ,还有一个叫FightView,它基本上就是所有渲染完成的地方。使用典型命令InputHandlerFightView类调用input = new InputHandler(anim, frame);InputHandler的构造函数如下所示:

public InputHandler(Animation animation, TextureRegion region){

    Assets.load();  //loads textures from files into memory and creates animations from them
    animation = Assets.playStance;  //set initial animation to be used
    region = animation.getKeyFrame(0, true);    //make TextureRegion equal to first frame in animation

}

现在,我想要发生的只是传递给构造函数的Animation和TextureRegion被设置为上面引用的值,所以,例如,如果我在{{1}中提到region声明FightView后的类,它将被设置为input。从我有限的Java经验来看,这是我认为应该发生的事情,但是我在编译时得到一个NullPointerException指向下面代码中的第二行:

animation.getKeyFrame(0, true);

显然, input = new InputHandler(anim, frame); x = centreX - (frame.getRegionWidth() / 2); 仍然为null,即使在通过构造函数传递之后,(在构造函数的第三行中可以看到)应该为其赋值。请注意,在传递给构造函数之前,它们实际上都是null - 我正在尝试创建一个类,它将在frame类中提供字段数据而不需要这样做。

任何帮助表示赞赏。这可能是错误的方法 - 我要做的是创建一个对象,在初始化时,将加载FightViewAnimation s数据。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是由于对基本Java概念的误解。 Java按值传递参数,而不是参考。你写的东西永远不会像你期望的那样工作。

首先,我建议您解决一个更简单的问题,或者进行一次侧面访问以强化一些基本的Java概念和对象概念。

其次,这是达到你想要的简短答案。

将成员添加到InputHandler类以保存Animation和TextureRegion。在构造函数中(不带任何参数),你可以像你所做的那样分配值,除非你将它们分配给成员变量。

class InputHandler {

    public Animation animation;
    public TextureRegion region;

    public InputHandler() {

        Assets.load();  //loads textures from files into memory and creates animations from them
        animation = Assets.playStance;  //set initial animation to be used
        region = animation.getKeyFrame(0, true);    //make TextureRegion equal to first frame in animation

    }
}

在构造InputHandler之后,您可以引用它的成员(在本例中为框架)并查看正确的值。

input = new InputHandler();
x = centreX - (input.frame.getRegionWidth() / 2);