3
respostas

Codigou parou de Compilar

Código estava rolando, agora após a última migration começou a dar NULLPOINTER.

https://github.com/neji-hyuga/display_contacts_app

se alguém puder me dar um retorno vai ser bem bacana, valeu!"

3 respostas

Faz o seguinte, Victor, roda o app e posta a StackTrace do erro (que aparece no Logcat) aqui pra gente te ajudar.

Segue Felipe, vlw.

2020-05-27 17:08:00.215 17394-17394/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.alura.displaycontactsapp, PID: 17394
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.alura.displaycontactsapp.model.Phone.getNumber()' on a null object reference
        at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.joinsInformation(StudentListAdapter.java:59)
        at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.getView(StudentListAdapter.java:50)
        at android.widget.AbsListView.obtainView(AbsListView.java:2370)
        at android.widget.ListView.makeAndAddView(ListView.java:1970)
        at android.widget.ListView.fillDown(ListView.java:704)
        at android.widget.ListView.fillFromTop(ListView.java:765)
        at android.widget.ListView.layoutChildren(ListView.java:1716)
        at android.widget.AbsListView.onLayout(AbsListView.java:2162)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
        at android.view.View.layout(View.java:17653)
        at android.view.ViewGroup.layout(ViewGroup.java:5579)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2364)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2086)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1272)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6408)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
        at android.view.Choreographer.doCallbacks(Choreographer.java:686)
        at android.view.Choreographer.doFrame(Choreographer.java:621)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6165)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)

Pela stacktrace, vemos que há um problema na linha 59 do StudentListAdapter ao fazer .getNumber() num objeto do tipo Phone, que está nulo:

Attempt to invoke virtual method 'java.lang.String com.alura.displaycontactsapp.model.Phone.getNumber()' on a null object reference
        at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.joinsInformation(StudentListAdapter.java:59)

Olhando essa linha, temos:

phone.setText(firstPhone.getNumber());

De acordo com o erro, essa variável firstPhone está nula, mas de onde ela vem? Temos logo acima a seguinte linha:

Phone firstPhone = dao.searchFirstStudentPhone(studentSelected.getId());

Então, está vindo de uma busca no banco. Vamos ver o que o método do dao faz:

    @Query("SELECT * FROM Phone WHERE studentId = :studentId LIMIT 1")
    Phone searchFirstStudentPhone(int studentId);

Aqui está tudo certo, então concluímos que esse não há um phone para esse studentId e, por isso ele retorna nulo. Porém, como esse erro apareceu após uma migration, vamos olhar como está essa tabela Phone:

Na linha 83 do ContactsMigrations temos:

database.execSQL("INSERT INTO Phone (phone, id)" +
                    "SELECT phone, id FROM Student");

Aqui temos algo estranho: veja que você está inserindo no id do Phone o id do Student. Porém esse id do Phone é Autoincrement, na realidade você deve inserir o id do Student no campo studentId do Phone, assim:

database.execSQL("INSERT INTO Phone (phone, studentId)" +
                    "SELECT phone, id FROM Student");

Bônus: na linha 86 dessa mesma ContactsMigrations há um erro de digitação (phone está minúsculo e deveria ser Phone), assim:

database.execSQL("UPDATE Phone SET typePhone =?", new TypePhoneNumber[] {HOME});