4
respostas

Erro "attempt to invoke virtual method on a null object reference"

Estou tentando fazer o membro editável, porém, quando vou inicializar a segunda activity, o app quebra.Códigos:

ListaDeMembros.java:

package com.example.membresiaigreja.activities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.NonNull;

import com.example.membresiaigreja.DAO.MembroDAO;
import com.example.membresiaigreja.R;
import com.example.membresiaigreja.models.Membro;

import java.util.List;

public class ListaDeMembros extends Activity {
    private final MembroDAO dao = new MembroDAO();
    final List<Membro> membros = dao.todos();

    public static final String TITULO_APPBAR = "Lista de Membros";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_de_membros);
        setTitle(TITULO_APPBAR);
    }

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


        ListView listaMembros = configuraLista();
        listaMembros.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int posicao, long id) {
                Membro membroEscolhido = membros.get(posicao);
                Intent trocaParaForm = new Intent(ListaDeMembros.this, FormularioNovoMembro.class);
                trocaParaForm.putExtra("membro", membroEscolhido);
                startActivity(trocaParaForm);
            }
        });
    }

    @NonNull
    private ListView configuraLista() {
        ListView listaMembros = findViewById(R.id.lbListaMembros);

        listaMembros.setAdapter(new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                membros));
        return listaMembros;
    }

    public void onClickNovo(View v) {
        abreFormularioNovoMembro();
    }

    private void abreFormularioNovoMembro() {
        startActivityForResult(
                new Intent(this, FormularioNovoMembro.class), 1);
    }
}

FormularioNovoMembro.java:

package com.example.membresiaigreja.activities;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.membresiaigreja.DAO.MembroDAO;
import com.example.membresiaigreja.R;
import com.example.membresiaigreja.models.Membro;

public class FormularioNovoMembro extends AppCompatActivity {
    public static final String TITULO_APPBAR = "Novo Membro";
    private EditText campoNome;
    private EditText campoTelefone;
    private EditText campoDataNascimento;
    private final MembroDAO dao = new MembroDAO();
    private Membro membro;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.formulario_novo_membro);
        setTitle(TITULO_APPBAR);
        inicializaCampos();
        configuraBotaoSalvar();

        Intent dados = getIntent();
        membro = (Membro) dados.getSerializableExtra("membro");
        campoNome.setText(membro.getNome());
        campoTelefone.setText(membro.getTelefone());
        campoDataNascimento.setText(membro.getDataNascimento());
    }

    private void configuraBotaoSalvar() {
        Button botaoSalvar = findViewById(R.id.btSalvar);
        botaoSalvar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*Membro membroCriado = criaMembro();
                salva(membroCriado);*/
                preencheMembro();
                dao.edita(membro);
                finish();
            }
        });
    }

    private void inicializaCampos() {
        campoNome = findViewById(R.id.edNome);
        campoTelefone = findViewById(R.id.edTelefone);
        campoDataNascimento = findViewById(R.id.edDataNascimento);
    }

    private void salva(Membro membro) {
        dao.salva(membro);
        finish();
    }

    private void preencheMembro() {
        String nome = campoNome.getText().toString();
        String telefone = campoTelefone.getText().toString();
        String dataNascimento = campoDataNascimento.getText().toString();

        membro.setNome(nome);
        membro.setTelefone(telefone);
        membro.setDataNascimento(dataNascimento);
    }
}

Erro: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.membresiaigreja.models.Membro.getNome()' on a null object reference Alguém pode me ajudar?

4 respostas

Olá Calebe!

O erro "java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.membresiaigreja.models.Membro.getNome()' on a null object reference" ocorre porque o objeto membro está nulo na classe FormularioNovoMembro. Isso acontece porque o objeto é passado através do Intent na classe ListaDeMembros, mas nem sempre ele é recebido corretamente na classe FormularioNovoMembro.

Para corrigir esse problema, você precisa garantir que o objeto membro seja passado corretamente para a FormularioNovoMembro quando você a chama. Verifique se o objeto está sendo passado corretamente antes de acessar os seus métodos e propriedades.

Além disso, é recomendado fazer uma verificação para garantir que o objeto membro não seja nulo antes de tentar acessar suas propriedades na classe FormularioNovoMembro. Você pode fazer isso adicionando uma condição de verificação antes de definir os campos no método onCreate da classe FormularioNovoMembro.

Aqui está uma sugestão de como fazer isso:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.formulario_novo_membro);
    setTitle(TITULO_APPBAR);
    inicializaCampos();
    configuraBotaoSalvar();

    Intent dados = getIntent();
    membro = (Membro) dados.getSerializableExtra("membro");
    if (membro != null) {
        campoNome.setText(membro.getNome());
        campoTelefone.setText(membro.getTelefone());
        campoDataNascimento.setText(membro.getDataNascimento());
    }
}

Adicionamos a verificação if (membro != null) para garantir que o objeto membro não seja nulo antes de tentar acessar suas propriedades.

Além disso, certifique-se de que a chave utilizada para passar o objeto membro no Intent é a mesma em ambas as classes (ListaDeMembros e FormularioNovoMembro). A chave "membro" deve ser idêntica em ambos os lugares.

Verifique esses pontos e teste novamente. Se o problema persistir ou se precisar de mais ajuda, por favor, compartilhe mais informações ou código relevante para que eu possa ajudar melhor.

Tentei colocar as verificações, dessa vez não dá nenhum erro. Porém, o membro também não é editado. Segue os códigos:

ListaDeMembros:

package com.example.membresiaigreja.activities;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.NonNull;

import com.example.membresiaigreja.DAO.MembroDAO;
import com.example.membresiaigreja.R;
import com.example.membresiaigreja.models.Membro;

import java.util.List;

public class ListaDeMembros extends Activity {
    private final MembroDAO dao = new MembroDAO();
    final List<Membro> membros = dao.todos();

    public static final String TITULO_APPBAR = "Lista de Membros";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_de_membros);
        setTitle(TITULO_APPBAR);
        membros.add(new Membro("Calebe", "(51)998320924", "21/03/2008"));
        membros.add(new Membro("Fabricio", "123456", "09/11/1981"));
    }

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


        ListView listaMembros = configuraLista();
        listaMembros.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int posicao, long id) {
                Membro membroEscolhido = membros.get(posicao);
                Intent trocaParaForm = new Intent(ListaDeMembros.this, FormularioNovoMembro.class);
                trocaParaForm.putExtra("membro", membroEscolhido);
                startActivity(trocaParaForm);
            }
        });
    }

    @NonNull
    private ListView configuraLista() {
        ListView listaMembros = findViewById(R.id.lbListaMembros);

        listaMembros.setAdapter(new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                membros));
        return listaMembros;
    }

    public void onClickNovo(View v) {
        abreFormularioNovoMembro();
    }

    private void abreFormularioNovoMembro() {
        startActivityForResult(
                new Intent(this, FormularioNovoMembro.class), 1);
    }
}

FormularioNovoMembro no próximo comentário

FormularioNovoMembro:

package com.example.membresiaigreja.activities;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.membresiaigreja.DAO.MembroDAO;
import com.example.membresiaigreja.R;
import com.example.membresiaigreja.models.Membro;

public class FormularioNovoMembro extends AppCompatActivity {
    public static final String TITULO_APPBAR = "Novo Membro";
    private EditText campoNome;
    private EditText campoTelefone;
    private EditText campoDataNascimento;
    private final MembroDAO dao = new MembroDAO();
    private Membro membro;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.formulario_novo_membro);
        setTitle(TITULO_APPBAR);
        inicializaCampos();
        configuraBotaoSalvar();

        Intent dados = getIntent();
        Membro membro = (Membro) dados.getSerializableExtra("membro");
        if(membro != null){
            campoNome.setText(membro.getNome());
            campoTelefone.setText(membro.getTelefone());
            campoDataNascimento.setText(membro.getDataNascimento());
        }
    }

    private void configuraBotaoSalvar() {
        Button botaoSalvar = findViewById(R.id.btSalvar);
        botaoSalvar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*Membro membroCriado = criaMembro();
                salva(membroCriado);*/
                preencheMembro();
                dao.edita(membro);
                finish();
            }
        });
    }

    private void inicializaCampos() {
        campoNome = findViewById(R.id.edNome);
        campoTelefone = findViewById(R.id.edTelefone);
        campoDataNascimento = findViewById(R.id.edDataNascimento);
    }

    private void salva(Membro membro) {
        dao.salva(membro);
        finish();
    }

    private void preencheMembro() {
        if(membro != null){
            String nome = campoNome.getText().toString();
            String telefone = campoTelefone.getText().toString();
            String dataNascimento = campoDataNascimento.getText().toString();

            membro.setNome(nome);
            membro.setTelefone(telefone);
            membro.setDataNascimento(dataNascimento);
        }
    }
}

Membro:

package com.example.membresiaigreja.models;

import androidx.annotation.NonNull;

import java.io.Serializable;

public class Membro implements Serializable {
    private String nome;
    private String telefone;
    private String dataNascimento;
    private int id = 0;

    public String getNome() {
        return nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public String getDataNascimento() {
        return dataNascimento;
    }

    public int getId() {
        return id;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public void setDataNascimento(String dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Membro(String nome, String telefone, String dataNascimento) {
        this.nome = nome;
        this.telefone = telefone;
        this.dataNascimento = dataNascimento;
    }

    @NonNull
    @Override
    public String toString() {
        String nome = "Nome: " + this.nome;
        String telefone = "Telefone: " + this.telefone;
        String dataNascimento = "Data de Nascimento: " + this.dataNascimento;
        return nome + System.lineSeparator() + telefone + System.lineSeparator() + dataNascimento;
    }
}

MembroDAO no próximo comentário

MembroDAO:

package com.example.membresiaigreja.DAO;

import com.example.membresiaigreja.models.Membro;

import java.util.ArrayList;
import java.util.List;

public class MembroDAO {

    private final static List<Membro> membros = new ArrayList<>();
    private static int contadorIds = 1;

    public void salva(Membro membro) {
        membro.setId(contadorIds);
        membros.add(membro);
        contadorIds++;
    }

    public void edita(Membro membro) {
        Membro membroEncontrado = null;
        for (Membro m :
                membros) {
            if (m.getId() == membro.getId()) {
                membroEncontrado = m;
            }
        }
        if (membroEncontrado != null) {
            int posicaoMembro = membros.indexOf(membroEncontrado);
            membros.set(posicaoMembro, membro);
        }
    }

    public List<Membro> todos() {
        return new ArrayList<>(membros);
    }
}

Quando eu tento editar o membro acontece o seguinte: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidadeEle não edita, apenas volta para a outra tela. Já tentei voltar no curso e refazer, mas não deu certo. Tem alguma ideia?