Android游戏开发人员-声明新对象后的NullPointerException(构造函数没有执行我希望它执行的操作)

Android游戏开发人员-声明新对象后的NullPointerException(构造函数没有执行我希望它执行的操作),android,nullpointerexception,libgdx,Android,Nullpointerexception,Libgdx,我目前正在学习使用一个名为libgdx的框架进行游戏编程。它允许用户制作可以在桌面上的Java虚拟机和Android手机上轻松运行的程序。我正在尝试制作一个基本程序,在屏幕上显示一个字符,并允许我用键盘前后移动它。我创建了3个类-一个名为资产,将文件加载到内存中并将其转换为纹理和动画;一个名为InPurthandler,通过更改动画、移动方向等响应按键输入;另一个名为飞行视图,基本上,所有渲染都是在这里完成的。使用典型的命令input=newinputhandler(anim,frame),从F

我目前正在学习使用一个名为libgdx的框架进行游戏编程。它允许用户制作可以在桌面上的Java虚拟机和Android手机上轻松运行的程序。我正在尝试制作一个基本程序,在屏幕上显示一个字符,并允许我用键盘前后移动它。我创建了3个类-一个名为
资产
,将文件加载到内存中并将其转换为纹理和动画;一个名为
InPurthandler
,通过更改动画、移动方向等响应按键输入;另一个名为
飞行视图
,基本上,所有渲染都是在这里完成的。使用典型的命令
input=newinputhandler(anim,frame),从
FightView
类调用
InputHandler
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

}
现在,我想做的只是将传递到构造函数中的动画和纹理区域设置为上面引用的值,例如,如果在声明
input
后在
FightView
类中提到
region
,它将被设置为
Animation.getKeyFrame(0,true)。根据我对Java有限的经验,我认为这是应该发生的,但我在编译时得到一个NullPointerException,指向下面代码中的第二行:

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


谢谢你的帮助。这可能是错误的做法-我试图创建一个对象,在初始化时,该对象将用数据加载
动画
纹理区域。

您遇到的问题是由于对基本Java概念的误解。Java通过值传递参数,而不是引用。你所写的永远不会像你所期望的那样有效

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

第二,这里有一个简单的答案来实现你的愿望

将成员添加到InputHandler类以保存动画和纹理区域。在构造函数(不带参数)中,除了将值分配给成员变量之外,您可以像以前一样分配值

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

谢谢你的帮助,我照你说的做了,现在代码是这样的:input=newinputhandler();frame=input.frame;x=centreX-(frame.getRegionWidth()/2);我在InputHandler中还有一个名为update()的方法,当按下按钮时,该方法会更改动画等。在调用该方法后,是否需要编写
frame=input.frame
行以进行这些更改?