5
respostas

Erro ao executar Jumper E/AndroidRuntime: FATAL EXCEPTION: main

Felipe,

Ao executar o Jumper, apresentou o seguinte erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: vlc.com.br.jumper, PID: 2508
                  java.lang.RuntimeException: Unable to resume activity {vlc.com.br.jumper/vlc.com.br.jumper.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void vlc.com.br.jumper.engine.Game.inicia()' on a null object reference

Seguem a MainActivity e a Game.

package vlc.com.br.jumper;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.FrameLayout;

import vlc.com.br.jumper.engine.Game;

public class MainActivity extends Activity {

    private Game game;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FrameLayout container = (FrameLayout) findViewById(R.id.container);

        Game game = new Game(this);
        container.addView(game);

    }


    @Override
    protected void onResume() {
        super.onResume();

        game.inicia();
        new Thread(game).start();

    }

    @Override
    protected void onPause() {
        super.onPause();
        game.pausa();
    }

}
package vlc.com.br.jumper.engine;

import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import vlc.com.br.jumper.elements.Passaro;

/**
 * Created by Valeria on 01/12/2016.
 */

public class Game extends SurfaceView implements Runnable {

    private boolean isRunning = true;
    private SurfaceHolder holder = getHolder();
    private Passaro passaro;

    public Game(Context context) {
        super(context);

        inicializaElementos();
    }

    private void inicializaElementos() {

        passaro = new Passaro();

    }

    @Override
    public void run() {

        while(isRunning) {
            //Neste loop vamos gerenciar os elementos do Jumper.
            if(!holder.getSurface().isValid()) continue;
            Canvas canvas = holder.lockCanvas();

            passaro.desenhaNo(canvas);
            passaro.cai();
            holder.unlockCanvasAndPost(canvas);

        }

    }

    public void inicia() {
        this.isRunning = true;
    }

    public void pausa() {
        this.isRunning = false;
    }
}
5 respostas

Felipe,

Por favor me ajude, não estou conseguindo dar continuidade ao curso, por conta do problema apresentado.

Grato.

Olá Vitor,

Ainda não fiz este curso, mas pelo que entendi do erro o objeto game não foi instanciado, é como se o método MainActivity. onResume estivesse sendo chamado antes do método MainActivity.onCreate .

Você tem o código do metodo main para poder dar uma olhada?

Rafael ,

Ai vai o código, obrigado pela ajuda.

package vlc.com.br.jumper;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.FrameLayout;

import vlc.com.br.jumper.engine.Game;

public class MainActivity extends Activity {

    private Game game;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FrameLayout container = (FrameLayout) findViewById(R.id.container);

        Game game = new Game(this);
        container.addView(game);

    }


    @Override
    protected void onResume() {
        super.onResume();

        game.inicia();
        new Thread(game).start();

    }

    @Override
    protected void onPause() {
        super.onPause();
        game.pausa();
    }

}

Olá Vitor,

Acredito que seja interessante verificar o que está sendo pedido, pelo que percebi do erro o objeto MainActivity não está executando o método onCreate, antes de executar o método onResume, isso está causando o erro, neste caso é necessário encontrar as chamadas destes métodos e garantir que o onResume não seja chamado antes do onCreate, visto que o objeto game é instanciado dentro do onCreate ao usar o onResume ou onPause antes de invocar o onCreate você irá receber o erro que está sendo exibido.

Infelizmente no modelo atual não dá para blindar o onResume e o onPause, visto que eles não recebem um objeto Bundle não há como tentar identificar se o game foi instanciado para então chamá-lo.

O que pode ser feito é talvez tratar o erro com um try-catch, contudo isso não vai executar o programa normalmente.

Vitor Luiz, tudo bem? Travei exatamente onde vc está! kkkk Mas a solução é bem simples. O erro está no trecho:

Game game = new Game(this);

Altere para:

this.game = new Game(this);

Vc já declarou o atributo game lá na parte de cima, então nesse trecho basta dizer que seu game(this) recebe new Game. Espero ter ajudado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software