Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.agenda.model.Telefone.getNumero()' on

Não consegui entendercomo resolver essa exception. Alguém pode me ajudar?

Logcat

2020-09-16 00:17:52.035 16781-16781/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2020-09-16 00:17:52.037 16781-16781/? E/Zygote: accessInfo : 1
2020-09-16 00:17:52.144 16781-16781/? E/.example.agend: Unknown bits set in runtime_flags: 0x8000
2020-09-16 00:17:53.533 16781-16781/com.example.agenda E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.agenda, PID: 16781
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.agenda.model.Telefone.getNumero()' on a null object reference
        at com.example.agenda.ui.adapter.ListaAlunosAdapter.vincula(ListaAlunosAdapter.java:65)
        at com.example.agenda.ui.adapter.ListaAlunosAdapter.getView(ListaAlunosAdapter.java:56)
        at android.widget.AbsListView.obtainView(AbsListView.java:3271)
        at android.widget.ListView.makeAndAddView(ListView.java:2238)
        at android.widget.ListView.fillDown(ListView.java:838)
        at android.widget.ListView.fillFromTop(ListView.java:900)
        at android.widget.ListView.layoutChildren(ListView.java:1946)
        at android.widget.AbsListView.onLayout(AbsListView.java:3041)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1103)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:530)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:1062)
        at android.view.View.layout(View.java:23754)
        at android.view.ViewGroup.layout(ViewGroup.java:7277)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3683)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3143)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2204)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9003)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:996)
        at android.view.Choreographer.doCallbacks(Choreographer.java:794)
        at android.view.Choreographer.doFrame(Choreographer.java:729)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:981)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7948)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
3 respostas

Método vincula()

private void vincula(View view, Aluno aluno) {
        TextView nome = view.findViewById(R.id.item_aluno_nome);
        nome.setText(aluno.getNome());
        TextView telefone = view.findViewById(R.id.item_aluno_telefone);
        Telefone primeiroTelefone = dao.buscaPrimeiroTelefoneDoAluno(aluno.getId());
        telefone.setText(primeiroTelefone.getNumero());
    }

Interface TelefoneDao

@Dao
public interface TelefoneDao {

    @Query("SELECT * FROM Telefone t WHERE t.alunoId = :alunoId LIMIT 1")
    //  O : (dois pontos) em alunoId significa que ele vai pegar o parâmetro no método
    //  buscaPrimeiroTelefoneDoAluno
    Telefone buscaPrimeiroTelefoneDoAluno(int alunoId);

    //  O var args envia vários parâmetros, basta preencher reticência depois do tipo
    @Insert
    void salva(Telefone... telefones);
}

AgendaMigrations

package com.example.agenda.database;

import androidx.annotation.NonNull;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

import com.example.agenda.model.TipoTelefone;

import static com.example.agenda.model.TipoTelefone.FIXO;

public class AgendaMigrations {

    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE aluno ADD COLUMN sobrenome TEXT");
        }
    };
    private static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        //  Exemplo de como excluir uma coluna, é um processo trabalhoso, por isso é
        //  importante fazer a tabela sem necessidade de alterar colunas
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //  Criar nova tabela com as informações desejadas
            database.execSQL("CREATE TABLE IF NOT EXISTS `Aluno_novo` " +
                    "(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                    "`nome` TEXT, " +
                    "`telefone` TEXT, " +
                    "`email` TEXT)");
            //  Copiar dados da tabela antiga para a nova
            database.execSQL("INSERT INTO Aluno_novo (id, nome, telefone, email)" +
                    "SELECT id, nome, telefone, email FROM Aluno");
            //  Remove tabela antiga
            database.execSQL("DROP TABLE Aluno");
            //  Renomear a tabela nova com o nome da tabela antiga
            database.execSQL("ALTER TABLE Aluno_novo RENAME TO Aluno");
        }
    };
    private static final Migration MIGRATION_3_4 = new Migration(3, 4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE aluno ADD COLUMN momentoDeCadastro INTEGER");
        }
    };
    private static final Migration MIGRATION_4_5 = new Migration(4, 5) {

        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE IF NOT EXISTS `Aluno_novo` (" +
                    "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                    "`nome` TEXT, " +
                    "`telefoneFixo` TEXT, " +
                    "`email` TEXT, " +
                    "`momentoDeCadastro` INTEGER, " +
                    "`telefoneCelular` TEXT)");

            database.execSQL("INSERT INTO Aluno_novo (id, nome, telefoneFixo, email, momentoDeCadastro)" +
                    "SELECT id, nome, telefone, email, momentoDeCadastro FROM Aluno");

            database.execSQL("DROP TABLE Aluno");

            database.execSQL("ALTER TABLE Aluno_novo RENAME TO Aluno");
        }
    };
    private static final Migration MIGRATION_5_6 = new Migration(5, 6) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE IF NOT EXISTS `Aluno_novo` (" +
                    "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                    "`nome` TEXT, " +
                    "`email` TEXT, " +
                    "`momentoDeCadastro` INTEGER)");

            database.execSQL("INSERT INTO Aluno_novo (id, nome, email, momentoDeCadastro)" +
                    "SELECT id, nome, email, momentoDeCadastro FROM Aluno");

            database.execSQL("CREATE TABLE IF NOT EXISTS `Telefone` (" +
                    "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                    "`numero` TEXT, " +
                    "`tipo` TEXT, " +
                    "`alunoId` INTEGER NOT NULL)");

            database.execSQL("INSERT INTO Telefone (numero, alunoId)" +
                    "SELECT telefoneFixo, id FROM Aluno");

            database.execSQL("UPDATE Telefone SET Tipo = ?", new TipoTelefone[] {FIXO});

            database.execSQL("DROP TABLE Aluno");

            database.execSQL("ALTER TABLE Aluno_novo RENAME TO Aluno");
        }
    };


    static final Migration[] TODAS_MIGRATIONS = {MIGRATION_1_2, MIGRATION_2_3,
            MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6};

}
solução!

A resposta está no texto depois desta aula:

private void vincula(View view, Aluno aluno) {
    TextView nome = view.findViewById(R.id.item_aluno_nome);
    nome.setText(aluno.getNome());
    TextView telefone = view.findViewById(R.id.item_aluno_telefone);
    Telefone primeiroTelefone = dao.buscaPrimeiroTelefoneDoAluno(aluno.getId());
    if (primeiroTelefone != null) {
        telefone.setText(primeiroTelefone.getNumero());
    }
}

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