切换屏幕时,LibGDX出现空指针异常

3
我正在使用LibGDX开发Android游戏。我已经创建了一些屏幕,如果我还没有访问过它们,我就能够成功地访问它们。例如,我可以从StartScreen转到HomeScreen,再到LoginScreen,最后到MainMenuScreen。然而,当我尝试通过点击注销按钮从我的MainMenuScreen切换到应用程序的StartScreen时,我会得到一个NPE:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.mathsvszombies2.game.Screens.MainMenuScreen$3.clicked(MainMenuScreen.java:145)
at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89)
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:58)
at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:353)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:332)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:217)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)

当我尝试从我的SignUpScreen通过点击注册按钮到达LoginScreen时,我会遇到相同的错误。然而,我不认为这是与button有关的错误,因为如我之前所提到的,使用button点击(如使用Login buttonHomeScreenLoginScreen)最初可以正常工作,因此我认为我的应用程序存在一个常见的error。现在让我们关注于当我点击登出按钮后,在MainMenuScreenStartScreen中发生的错误。
我从在MainMenuScreen类顶部声明我的Game变量开始:
private Game game;

这是我的MainMenuScreen构造函数:

public MainMenuScreen(Game game) {

    app.log("Screen", "Main Menu Screen");
    camera= new OrthographicCamera();
    viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
    stage = new Stage(viewport);
}

这是我尝试切换屏幕的地方:

logoutBtn.addListener(new ClickListener(){

        @Override
        public void clicked(InputEvent event, float x, float y) {
            LoginScreen.isLoggedIn = false;
            game.setScreen(new StartScreen(game));
        }
    });

这是我的StartScreen类-我从在StartScreen类的顶部声明我的Game变量开始:

private Game game;

这是我的StartScreen构造函数:

public StartScreen(Game game){
    Gdx.app.log("Screen", "Start Screen");
    this.game = game;
    camera= new OrthographicCamera();
    viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
    stage = new Stage(viewport);
    StartScreenActor actor = new StartScreenActor();
    stage.addActor(actor);
    Gdx.input.setInputProcessor(stage);
}

我该如何解决这个问题?

可能是什么是NullPointerException,如何修复它?的重复问题。 - Tenfour04
1个回答

0
简单来说,你只需要在任何屏幕类的构造方法中添加这行代码即可:
this.game = game;

这意味着这个对象是游戏的实例。如果没有它,在调用game.setScreen(new StartScreen(game));时,传递“game”到StartScreen时将无法引用它,因此会出现NullPointerException。
更新后的MainMenuScreen构造函数:
public MainMenuScreen(Game game) {
    this.game = game;
    app.log("Screen", "Main Menu Screen");
    camera= new OrthographicCamera();
    viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
    stage = new Stage(viewport);
}

这是您需要进行的唯一更改,现在更改屏幕将正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接