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

Problemas na execução.

Estou tentando rodar o meu programa porém quando clico para criar um novo cliente ele está gerando as seguintes mensagens de erro no LogCat:

10-22 11:31:41.575: D/dalvikvm(1250): GC_FOR_ALLOC freed 55K, 4% free 3141K/3272K, paused 93ms, total 94ms

10-22 11:31:41.575: I/dalvikvm-heap(1250): Grow heap (frag case) to 4.208MB for 1127536-byte allocation

10-22 11:31:41.735: D/dalvikvm(1250): GC_FOR_ALLOC freed 2K, 4% free 4240K/4376K, paused 124ms, total 124ms

10-22 11:31:42.485: I/Choreographer(1250): Skipped 36 frames! The application may be doing too much work on its main thread.

10-22 11:31:42.715: D/gralloc_goldfish(1250): Emulator without GPU emulation detected.

10-22 11:31:47.195: D/dalvikvm(1250): GC_FOR_ALLOC freed 30K, 3% free 4713K/4820K, paused 211ms, total 237ms

10-22 11:31:47.605: D/AndroidRuntime(1250): Shutting down VM

10-22 11:31:47.605: W/dalvikvm(1250): threadid=1: thread exiting with uncaught exception (group=0xb1aabba8)

10-22 11:31:47.685: E/AndroidRuntime(1250): FATAL EXCEPTION: main

10-22 11:31:47.685: E/AndroidRuntime(1250): Process: br.com.caelum.cadastro, PID: 1250

10-22 11:31:47.685: E/AndroidRuntime(1250): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.caelum.cadastro/br.com.caelum.cadastro.FormularioActivity}: java.lang.NullPointerException

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread.access$800(ActivityThread.java:135)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.os.Handler.dispatchMessage(Handler.java:102)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.os.Looper.loop(Looper.java:136)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread.main(ActivityThread.java:5001)

10-22 11:31:47.685: E/AndroidRuntime(1250): at java.lang.reflect.Method.invokeNative(Native Method)

10-22 11:31:47.685: E/AndroidRuntime(1250): at java.lang.reflect.Method.invoke(Method.java:515)

10-22 11:31:47.685: E/AndroidRuntime(1250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)

10-22 11:31:47.685: E/AndroidRuntime(1250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

10-22 11:31:47.685: E/AndroidRuntime(1250): at dalvik.system.NativeStart.main(Native Method)

10-22 11:31:47.685: E/AndroidRuntime(1250): Caused by: java.lang.NullPointerException

10-22 11:31:47.685: E/AndroidRuntime(1250): at br.com.caelum.cadastro.FormularioHelper.colocaAlunoNoFormulario(FormularioHelper.java:42)

10-22 11:31:47.685: E/AndroidRuntime(1250): at br.com.caelum.cadastro.FormularioActivity.onCreate(FormularioActivity.java:23)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.Activity.performCreate(Activity.java:5231)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)

10-22 11:31:47.685: E/AndroidRuntime(1250): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)

10-22 11:31:47.685: E/AndroidRuntime(1250): ... 11 more

10-22 11:31:52.945: I/Process(1250): Sending signal. PID: 1250 SIG: 9

Reanalisei o meu AlunoDAO, FormularioHelper, FormularioActivity e também a ListaAlunosActivity, porém não consegui identificar o erro. Alguém poderia me ajudar?

Estou postando todos aqui abaixo:

package br.com.caelum.cadastro.dao;

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

import android.content.ContentValues;
import android.database.Cursor;
import br.com.caelum.cadastro.modelo.Aluno;

public class AlunoDAO {
    private static final String TABELA = "Aluno";

    private final DBHelper helper;

    public AlunoDAO(DBHelper helper){
        this.helper = helper;
    }

    private ContentValues toContentValues(Aluno aluno) {
        ContentValues values = new ContentValues();
        values.put("nome", aluno.getNome());
        values.put("telefone", aluno.getTelefone());
        values.put("endereco", aluno.getEndereco());
        values.put("site", aluno.getSite());
        values.put("nota", aluno.getNota());
        values.put("caminhoFoto", aluno.getCaminhoFoto());
        return values;
    }

    public void insere(Aluno aluno){
        ContentValues cv = toContentValues(aluno);
        helper.getWritableDatabase().insert(TABELA, null, cv);

    }

    public List<Aluno> getLista() {
        List<Aluno> alunos = new ArrayList<Aluno>(); 
        String sql = "SELECT * FROM " + TABELA + ";";
        Cursor c = helper.getReadableDatabase().rawQuery(sql, null);
        while (c.moveToNext()){
            Aluno aluno = new Aluno();
            aluno.setId(c.getLong(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setTelefone(c.getString(c.getColumnIndex("telefone")));
            aluno.setSite(c.getString(c.getColumnIndex("site")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));
            aluno.setCaminhoFoto(c.getString(c.getColumnIndex("caminhoFoto")));

            alunos.add(aluno);
        }
        return alunos;
    }

    public void deletar(Aluno aluno) {
        String[] args = {aluno.getId().toString()};
        helper.getWritableDatabase().delete(TABELA, "id=?", args);
    }

    public void atualizar(Aluno aluno) {
        ContentValues cv = toContentValues(aluno);
        String[] args = {aluno.getId().toString()};
        helper.getWritableDatabase().update(TABELA, cv, "id=?", args);

    }


}
package br.com.caelum.cadastro;

import android.widget.EditText;
import android.widget.SeekBar;
import br.com.caelum.cadastro.modelo.Aluno;

public class FormularioHelper {

    private EditText campoNome;
    private EditText campoEndereco;
    private EditText campoSite;
    private EditText campoTelefone;
    private SeekBar campoNota;
    private Aluno aluno;

    public FormularioHelper(FormularioActivity activity) {
        aluno = new Aluno();
        campoNome = (EditText) activity.findViewById(R.id.nome);
        campoEndereco = (EditText) activity.findViewById(R.id.endereco);
        campoSite = (EditText) activity.findViewById(R.id.site);
        campoTelefone = (EditText) activity.findViewById(R.id.telefone);
        campoNota = (SeekBar) activity.findViewById(R.id.nota);
    }

    public Aluno pegaAlunoDoFormulario(){
        String nome = campoNome.getText().toString();
        String endereco = campoEndereco.getText().toString();
        String telefone = campoTelefone.getText().toString();
        String site = campoSite.getText().toString();
        int nota = campoNota.getProgress();

        aluno.setNome(nome);
        aluno.setEndereco(endereco);
        aluno.setSite(site);
        aluno.setTelefone(telefone);
        aluno.setNota(Double.valueOf(nota));

        return aluno;
    }

    public void colocaAlunoNoFormulario(Aluno alunoParaSerAlterado) {
        campoNome.setText(alunoParaSerAlterado.getNome());
        campoEndereco.setText(alunoParaSerAlterado.getEndereco());
        campoSite.setText(alunoParaSerAlterado.getSite());
        campoTelefone.setText(alunoParaSerAlterado.getTelefone());
        campoNota.setProgress(alunoParaSerAlterado.getNota().intValue());
    }
}
package br.com.caelum.cadastro;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import br.com.caelum.cadastro.dao.AlunoDAO;
import br.com.caelum.cadastro.dao.DBHelper;
import br.com.caelum.cadastro.modelo.Aluno;

public class FormularioActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.formulario);
        final Button botao = (Button) findViewById(R.id.btngravar);
        final FormularioHelper helper = new FormularioHelper(this);
        final Aluno alunoParaSerAlterado = (Aluno) getIntent().getSerializableExtra("alunoSelecionado");
        final DBHelper db = new DBHelper(this);
        helper.colocaAlunoNoFormulario(alunoParaSerAlterado);
        Toast.makeText(this, "Aluno: " + alunoParaSerAlterado, Toast.LENGTH_SHORT).show();
        botao.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FormularioActivity.this, "Você clicou no Botão", Toast.LENGTH_LONG).show();
                Aluno aluno = helper.pegaAlunoDoFormulario();
                AlunoDAO dao = new AlunoDAO(db);
                if (alunoParaSerAlterado != null) {
                    aluno.setId(alunoParaSerAlterado.getId());
                    botao.setText("Alterar");
                    dao.atualizar(aluno);
                } else {
                    dao.insere(aluno);
                }

                db.close();
                finish();
            }
        });
    }
}
package br.com.caelum.cadastro;

import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import br.com.caelum.cadastro.dao.AlunoDAO;
import br.com.caelum.cadastro.dao.DBHelper;
import br.com.caelum.cadastro.modelo.Aluno;

public class ListaAlunosActivity extends Activity {

    private ListView lista;
    private Aluno aluno;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listagem_alunos);

        lista = (ListView) findViewById(R.id.lista);
        registerForContextMenu(lista);

        lista.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int posicao, long id) {
                Aluno alunoParaSerAlterado = (Aluno) adapter.getItemAtPosition(posicao);
                Intent irParaFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                irParaFormulario.putExtra("alunoSelecionado", alunoParaSerAlterado);
                startActivity(irParaFormulario);

            }
        });

        lista.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> adapter, View view, int posicao, long id) {
                aluno = (Aluno) adapter.getItemAtPosition(posicao);
                return false;
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_lista_alunos, menu);

        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.novo:
            Intent irParaFormulario = new Intent(this, FormularioActivity.class);
            startActivity(irParaFormulario);
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void carregaLista() {
        DBHelper db = new DBHelper(this);
        AlunoDAO dao = new AlunoDAO(db);
        List<Aluno> alunos = dao.getLista();

        ArrayAdapter<Aluno> adapter = 
                new ArrayAdapter<Aluno>(this, android.R.layout.simple_list_item_1, alunos);

        lista.setAdapter(adapter);
        db.close();

    }
    @Override
    protected void onResume() {
        super.onResume();
        this.carregaLista();
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        MenuItem ligar = menu.add("Ligar");
        ligar.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent irParaATelaDeDiscagem = new Intent(Intent.ACTION_CALL);
                Uri telefoneDoAluno = Uri.parse("tel:" + aluno.getTelefone());
                irParaATelaDeDiscagem.setData(telefoneDoAluno);
                return false;
            }
        });
        MenuItem sms = menu.add("Enviar SMS");
        sms.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent enviarSMS = new Intent(Intent.ACTION_VIEW);
                Uri telefoneDoAluno = Uri.parse("sms:" + aluno.getTelefone());
                enviarSMS.setData(telefoneDoAluno);
                enviarSMS.putExtra("sms_body", "Mensagem para o Aluno " + aluno.getNome().toString());
                return false;
            }
        });
        MenuItem mapa = menu.add("Achar no Mapa");
        mapa.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent acharNoMapa = new Intent(Intent.ACTION_VIEW);
                Uri enderecoDoAluno = Uri.parse("geo:0,0?z=14&q" + aluno.getEndereco());
                acharNoMapa.setData(enderecoDoAluno);
                return false;
            }
        });
        MenuItem site = menu.add("Navegar no Site");
        site.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent abrirOSiteDoAluno = new Intent(Intent.ACTION_VIEW);
                Uri siteDoAluno = Uri.parse("http://" + aluno.getSite());
                abrirOSiteDoAluno.setData(siteDoAluno);
                return false;
            }
        });
        MenuItem deletar = menu.add("Deletar");
        deletar.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                DBHelper db = new DBHelper(ListaAlunosActivity.this);
                AlunoDAO dao = new AlunoDAO(db);
                dao.deletar(aluno);
                db.close();
                carregaLista();
                return false;
            }
        });
        menu.add("Enviar E-mail");
        super.onCreateContextMenu(menu, v, menuInfo);
    }


}
2 respostas
solução!

Olá Alexandre!

Vamos analisar esse pedaço do código da FormularioActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        final Aluno alunoParaSerAlterado = (Aluno) getIntent().getSerializableExtra("alunoSelecionado");
        helper.colocaAlunoNoFormulario(alunoParaSerAlterado);
        ...
    }

Quando selecionamos um aluno na lista, penduramos o aluno selecionado na intent para que possamos preencher os dados no formulário. O código acima está preparado para fazer justamente isso. Ele recupera o aluno pendurado na intent e coloca no formulário. Mas o que acontece se entrarmos na tela do formulário sem pendurar nenhum aluno na intent? (como é o caso de criarmos um novo aluno)

Nesse caso, quando fizermos o getSerializableExtra("alunoSelecionado") ele devolverá um valor null pois não há nenhum aluno na intent. Quando o método colocaAlunoNoFormulario for invocado, ele vai tentar acessar os dados do aluno que nesse momento tem o valor null, por isso a NullPointerException.

Para resolver isso é bem tranquilo, basta fazer uma verificação simples: se o aluno for diferente de null chamamos o método colocaAlunoNoFormulario; caso contrário, só seguimos em frente.

Abraço!

Muito Obrigado Jeferson, o problema foi resolvido e entendi muito bem o motivo do erro ter acontecido.

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