Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Objeto null

Tenho este banco

String carroSQL = "CREATE TABLE Carro (carro_id INTEGER PRIMARY KEY, carro_nome TEXT NOT NULL);";
        String carroPerguntaSQL = "CREATE TABLE CarroPergunta (cpergunta_id INTEGER PRIMARY KEY, cpergunta TEXT NOT NULL);";
        String carroRespostaSQL = "CREATE TABLE CarroResposta (cresposta_id INTEGER PRIMARY KEY," +
                "idCarro INTEGER REFERENCES Carro(carro_id)," +
                "idPergunta INTEGER REFERENCES CarroPergunta(cpergunta_id)," +
                "cresposta_desc TEXT, cresposta_obs TEXT);";
        String carroHoraDataSQL = "CREATE TABLE DiaHora(dh_id INTEGER PRIMARY KEY, dia TEXT, hora TEXT, km TEXT, " +
                "idCarro INTEGER REFERENCES Carro);";

E quero que ele me traga apenas as datas de determinado carro, então fiz isso:

  public List<RespostaCarro> buscaData(Long idCar) {
        List<RespostaCarro> respostas = new ArrayList<>();
        Cursor c = dao.getReadableDatabase().rawQuery("SELECT * FROM DiaHora JOIN Carro ON idCarro=carro_id WHERE idCarro=?",new String[]{idCar.toString()});
        while (c.moveToNext()){
            RespostaCarro r = new RespostaCarro();
                r.setIdCarro(c.getLong(c.getColumnIndex("idCarro")));
                r.setData(c.getString(c.getColumnIndex("dia")));
                r.setHora(c.getString(c.getColumnIndex("hora")));
                r.setKm(c.getString(c.getColumnIndex("km")));
         respostas.add(r);
        }c.close();
        return respostas;
    }
    private void carregaListaInspecoes() {
        pCarroDAO dao = new pCarroDAO(ListaInspecoesActivity.this);

        Long idCar = carro.getId();

        List<RespostaCarro> respostaCarros = dao.buscaData(idCar);
        dao.close();
        listaRespostas = findViewById(R.id.lista_insp);
        ArrayAdapter<RespostaCarro> adapter = new ArrayAdapter<RespostaCarro>(this, android.R.layout.simple_list_item_1, respostaCarros);
        listaRespostas.setAdapter(adapter);
    }

Porém ele esta dando como objeto nulo, não sei como fazer.

11 respostas

Oi Rafaela, tudo bem ?

O que está vindo como nulo ?

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.hlnengenharia.app, PID: 26609
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.hlnengenharia.app/br.com.hlnengenharia.app.listas.ListaInspecoesActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Long br.com.hlnengenharia.app.model.Carro.getId()' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5728)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Long br.com.hlnengenharia.app.model.Carro.getId()' on a null object reference
                      at br.com.hlnengenharia.app.listas.ListaInspecoesActivity.carregaListaInspecoes(ListaInspecoesActivity.java:64)
                      at br.com.hlnengenharia.app.listas.ListaInspecoesActivity.onCreate(ListaInspecoesActivity.java:34)
                      at android.app.Activity.performCreate(Activity.java:6301)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
                      at android.os.Handler.dispatchMessage(Handler.java:111) 
                      at android.os.Looper.loop(Looper.java:207) 
                      at android.app.ActivityThread.main(ActivityThread.java:5728) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

Pelo erro, parece que o seu objeto carro está nulo, consegue confirmar se você passa alguma referencia ?

Exato, diz estar nulo, porém eu passo a referencia na hora de fazer a busca no banco e depois chamo na activity, mas ele não reconhece (?)

Aparentemente a sua busca pode não estar sendo realizada. Não sei te responder o real motivo, pelo pouco contexto que vi seu código, o que eu falaria é que em nenhum lugar você passou uma instância para carro.

Como eu passaria essa instancia? Pois aparentemente o que eu fiz foi igual às outras classes que tenho o mesmo tipo de busca.

quer mostrar o restante do código para gente ver se tem algo que não estamos vendo ?

pode dar uma olhada pelo git

solução!

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_inspecoes);


        carregaListaInspecoes();
        setTitle("");

        carregaNomeCarro();

        novaInspecao = findViewById(R.id.nova_insp);
        novaInspecao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent vaiParaInspecao = new Intent(ListaInspecoesActivity.this, CadDataKmActivity.class);
                vaiParaInspecao.putExtra("carro", carro);
                startActivity(vaiParaInspecao);
            }
        });

    }

Você primeiro está carregando as inspeções antes de ter um carro, acho que basta alterar a ordem que deve ser resolvido, rs.

Erra isso mesmo, muito obrigada!

Não há de que :D