未检测到的空指针异常

时间:2016-11-23 06:34:19

标签: android-studio nullpointerexception libgdx scene2d

我有关于空指针异常的错误,我无法在程序中找到错误的确切位置。我在网上搜索了可能的解决方案,但我发现它们都没有用。我知道Null Pointer Exception是什么,但是我无法确定我的代码中出了什么问题。任何帮助将不胜感激,谢谢。

这是我的代码:

LevelOneScreen.java

public class LevelOneScreen implements Screen {

    private final ThumbChase app;
    WalkAnimate walkAnimate;
    private Stage stage;
    private Image levelOneImage;
    private Image holdStartImage;
    public Image walkRightImage;
    public Image walkLeftImage;
    public float deltaTime = Gdx.graphics.getDeltaTime();


    public LevelOneScreen(final ThumbChase app){
        this.app = app;
        this.stage = new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera));

    }
    @Override
    public void show() {

        Gdx.input.setInputProcessor(stage);
        walkAnimate = new WalkAnimate();

        levelOneBackground();
        holdStart();
        ninjaWalk();                            ==>ERROR1:LevelOneScreen.java:54


    }



    public void holdStart(){
        Texture holdStartTexture = new Texture("HoldStart.png");
        holdStartImage = new Image(holdStartTexture);
        float holdStartImageW = holdStartImage.getWidth();
        float holdStartImageH = holdStartImage.getHeight();
        float holdStartImgWidth = app.screenWidth*0.8f;
        float holdStartImgHeight = holdStartImgWidth *(holdStartImageH/holdStartImageW);
        holdStartImage.isTouchable();
        holdStartImage.setSize(holdStartImgWidth,holdStartImgHeight);
        holdStartImage.setPosition(stage.getWidth()/2-holdStartImgWidth/2,stage.getHeight()/2-holdStartImgHeight/2);
        stage.addActor(holdStartImage);
        holdStartImage.addListener(new ActorGestureListener(){
            public void touchDown (InputEvent event, float x, float y, int pointer, int button){
                holdStartImage.setVisible(false);
            };
        });


        }


    public void levelOneBackground(){
        Texture levelOneTexture = new Texture("BGBlue Resize.png");
        levelOneImage = new Image(levelOneTexture);
        levelOneImage.setSize(app.screenWidth,app.screenHeight);
        levelOneImage.setPosition(0,0);
        stage.addActor(levelOneImage);
        levelOneImage.addListener(new ActorGestureListener(){
            public void touchDown (InputEvent event, float x, float y, int pointer, int button){
                holdStartImage.setVisible(false);
            };
        });
    }
    public void ninjaWalk(){

ERROR2==>   TextureRegion ninjaWalkRight = new TextureRegion(walkAnimate.getCurrentFrameRight());
            TextureRegion ninjaWalkLeft = new TextureRegion(walkAnimate.getCurrentFrameLeft());
            walkRightImage = new Image(ninjaWalkRight);
            walkLeftImage = new Image(ninjaWalkLeft);
            float walkImageW = walkRightImage.getWidth();
            float walkImageH = walkRightImage.getHeight();
            float walkImageWidth = app.screenWidth*0.15f;
            float walkImageHeight = walkImageWidth*(walkImageH/walkImageW);
            walkLeftImage.isTouchable();
            walkRightImage.isTouchable();
            walkRightImage.setSize(walkImageWidth,walkImageHeight);
            walkLeftImage.setSize(walkImageWidth,walkImageHeight);
            walkRightImage.setPosition(stage.getWidth()/2-walkImageWidth/2,0);
            walkLeftImage.setPosition(stage.getWidth()/2-walkImageWidth/2,0);
            walkLeftImage.addAction(moveBy(3f,3f,3f));
            stage.addActor(walkLeftImage);


        }

        @Override
        public void render(float delta) {

            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            walkAnimate.update(deltaTime);
            update(delta);
        }

        public void update(float delta){
            stage.act(delta);
            stage.draw();
            app.batch.begin();

            app.batch.end();
        }

        @Override
        public void resize(int width, int height) {

        }

        @Override
        public void pause() {

        }

        @Override
        public void resume() {

        }

        @Override
        public void hide() {

        }

        @Override
        public void dispose() {
            stage.dispose();

        }
    }

WalkAnimate.java

public class WalkAnimate {

        public ThumbChase app;
        public Stage stage;


        private Animation walkAnimationRight;
        private Animation walkAnimationLeft;
        private Texture walkSheetRight;
        private Texture walkSheetLeft;
        private TextureRegion[] walkFramesRight;
        private TextureRegion[] walkFramesLeft;
        private TextureRegion   currentFrameRight;
        private TextureRegion   currentFrameLeft;
        private float stateTime;
        private Rectangle bound; //used for positioning and collision detection
        private static final int  FRAME_COLS_WALK = 3;
        private static final int  FRAME_ROWS_WALK= 2;
        private float screenWidth = Gdx.graphics.getWidth();
        private float screenHeight = Gdx.graphics.getHeight();
        public float currentFrameWidth = (float)(screenHeight*0.15);
        public float currentFrameHeight = (float)(screenHeight*0.15);
        public float walkSheetWidth;
        public float walkSheetHeight;



        public WalkAnimate () {

            walkSheetRight = new Texture("ninjaWalkRight.png");
            walkSheetWidth = walkSheetRight.getWidth();
            walkSheetHeight = walkSheetRight.getWidth();
            TextureRegion[][] tmp = TextureRegion.split(walkSheetRight, (int) walkSheetRight.getWidth() / FRAME_COLS_WALK, (int) walkSheetRight.getHeight() / FRAME_ROWS_WALK);
            walkFramesRight = new TextureRegion[FRAME_COLS_WALK * FRAME_ROWS_WALK];
            int index = 0 ;
            for (int i = 0; i < FRAME_ROWS_WALK; i++) {
                for (int j = 0; j < FRAME_COLS_WALK; j++) {
                    walkFramesRight[index++] = tmp[i][j];
                }
            }
            walkAnimationRight = new Animation(0.044f, walkFramesRight);
            stateTime = 0f;


            walkSheetLeft = new Texture("ninjaWalkLeft.png");
            walkSheetWidth = walkSheetLeft.getWidth();
            walkSheetHeight = walkSheetLeft.getWidth();
            TextureRegion[][] tmp1 = TextureRegion.split(walkSheetLeft, (int) walkSheetRight.getWidth() / FRAME_COLS_WALK, (int)walkSheetLeft.getHeight() / FRAME_ROWS_WALK);
            walkFramesLeft = new TextureRegion[FRAME_COLS_WALK * FRAME_ROWS_WALK];
            int index1 = 0;
            for (int i = 0; i < FRAME_ROWS_WALK; i++) {
                for (int j = 0; j < FRAME_COLS_WALK; j++) {
                    walkFramesLeft[index1++] = tmp1 [i][j];
                }
            }
            walkAnimationLeft = new Animation(0.044f, walkFramesLeft);
            stateTime = 0f;


        }


        public Rectangle getBound(){
            return bound;
        }

        public void update(float delta){
            stateTime += delta;
            currentFrameRight = walkAnimationRight.getKeyFrame(stateTime, true);
            currentFrameLeft = walkAnimationLeft.getKeyFrame(stateTime, true);
        }


        public TextureRegion getCurrentFrameRight(){
            return currentFrameRight;

        }
        public TextureRegion getCurrentFrameLeft(){
            return currentFrameLeft;
        }
    }

这就是错误:

> java.lang.NullPointerException
>                                                                                   at
> com.badlogic.gdx.graphics.g2d.TextureRegion.setRegion(TextureRegion.java:112)
>                                                                                   at
> com.badlogic.gdx.graphics.g2d.TextureRegion.<init>(TextureRegion.java:63)
>                                                                                   at
> com.jpfalmazan.thumbchaseninja.GameScreens.LevelOneScreen.show(LevelOneScreen.java:54)
>                                                                                   at com.badlogic.gdx.Game.setScreen(Game.java:61)
>                                                                                   at
> com.jpfalmazan.thumbchaseninja.GameScreens.MenuScreen$1.clicked(MenuScreen.java:82)
>                                                                                   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.android.AndroidInput.processEvents(AndroidInput.java:379)
>                                                                                   at
> com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:457)
>                                                                                   at
> android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
>                                                                                   at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

3 个答案:

答案 0 :(得分:0)

你可以在logcat日志中找到确切的行,你可以看到活动名称和代码行,点击它就可以重定向到同一行的各个Activity ..

希望这会对你有所帮助。

答案 1 :(得分:0)

在第一次致电walkAnimate.update(dt)之前,您似乎没有致电walkAnimate.getCurrentFrameRight(),因此walkAnimate.getCurrentFrameRight()会返回null

此外,在ninjaWalk()中您创建了两个actor(walkRightImagewalkLeftImage),只向舞台添加一个并且永远不会更新它的纹理。你应该重新设计你的概念:在启动时创建一个actor,将它存储在一个字段中,并在渲染/更新方法中更改它的纹理。

答案 2 :(得分:0)

您的一个纹理要么命名错误,要么在加载之前尝试访问它。

你可以告诉这个例外;

com.badlogic.gdx.graphics.g2d.TextureRegion.setRegion(TextureRegion.java:112)

这意味着纹理区域无法将纹理标识符映射到程序中的有效纹理,因此ninjaWalkRightninjaWalkLeft不存在或未加载。

如果您使用纹理打包器,请确保您的文件名为ninjaWalkRightninjaWalkLeft

同样使用AssetManager确保在尝试访问这些文件之前加载这些文件,因为这也可能是一个问题。