Solucionado (ver solução)
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