Application is returning Nullpointerexception error although the object is set

Asked

Viewed 77 times

1

Error while clicking save the new process after assigning the data in each field:

java.lang.NullPointerException: Attempt to invoke virtual method 'long com.example.alex.levprocess.processos.RepositorioProcesso.salvar(com.example.alex.levprocess.processos.Processo)' on a null object reference 
at com.example.alex.levprocess.processos.NovoProcesso.salvarProcesso(NovoProcesso.java:76)
at com.example.alex.levprocess.processos.NovoProcesso.salvar(NovoProcesso.java:69)
at com.example.alex.levprocess.processos.NovoProcesso$2.onClick(NovoProcesso.java:45)

Class Novoprocesses

package com.example.alex.levprocess.processos;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import com.example.alex.levprocess.R;
import com.example.alex.levprocess.cliente.MenuCliente;

public class NovoProcesso extends Activity {

private EditText nome, responsavel, papel, objetivo, condicao, entradas, saidas, roteiro;
private Long id;

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.novo_processo);
    nome = (EditText) findViewById(R.id.etNomeProcesso);
    responsavel = (EditText) findViewById(R.id.etResponsavel);
    papel = (EditText) findViewById(R.id.etPapel);
    objetivo = (EditText) findViewById(R.id.etObjetivo);
    condicao = (EditText) findViewById(R.id.etCondicao);
    entradas = (EditText) findViewById(R.id.etEntradas);
    saidas = (EditText) findViewById(R.id.etSaidas);
    roteiro = (EditText) findViewById(R.id.etRoteiro);
    id = null;
    ImageButton btCancelar = (ImageButton) findViewById(R.id.btCancelar);
    Button cdsRoteiro = (Button) findViewById(R.id.botaoRoteiro);

    btCancelar.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            setResult(RESULT_CANCELED);
            finish();// Fecha a tela
        }
    });
    ImageButton btSalvar = (ImageButton) findViewById(R.id.btSalvar);
    btSalvar.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            salvar();
        }
    });
}
protected void onPause() {
    super.onPause();
    // Cancela para nao ficar nada na tela pendente
    setResult(RESULT_CANCELED);
    // Fecha a tela
    finish();
}
public void salvar() {
    Processo processo = new Processo();
    if (id != null) {
        processo.id = id;// E uma atualizacao
    }
    processo.nome = nome.getText().toString();
    processo.responsavel = responsavel.getText().toString();
    processo.papel = papel.getText().toString();
    processo.objetivo = objetivo.getText().toString();
    processo.condicao = condicao.getText().toString();
    processo.entradas = entradas.getText().toString();
    processo.saidas = saidas.getText().toString();
    processo.roteiro = roteiro.getText().toString();
    salvarProcesso(processo);// Salvar
    setResult(RESULT_OK, new Intent()); // OK
    // Fecha a tela
    finish();
}

protected void salvarProcesso(Processo processo) {
    CadastroProcessos.repositorio.salvar(processo);
}

}

Data from the Repository Class

public long salvar(Processo processo) {
long id = processo.id;
if (id != 0) {
    atualizar(processo);
} else {
    // Insere novo
    id = inserir(processo);
}
return id;
}

// Insere um novo processo
public long inserir(Processo processo) {
ContentValues values = new ContentValues();
values.put(Processos.NOME, processo.nome);
values.put(Processos.RESPONSAVEL, processo.responsavel);
values.put(Processos.PAPEL, processo.papel);
values.put(Processos.OBJETIVO, processo.objetivo);
values.put(Processos.CONDICAO, processo.condicao);
values.put(Processos.ENTRADAS, processo.entradas);
values.put(Processos.SAIDAS, processo.saidas);
values.put(Processos.ROTEIRO, processo.roteiro);
long id = inserir(values);
return id;
}
// Insere um novo processo
public long inserir(ContentValues valores) {
long id = db.insert(NOME_TABELA, "", valores);
return id;
}

Class Registration process

import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;

import com.example.alex.levprocess.R;
import com.example.alex.levprocess.processos.Processo.Processos;

public class CadastroProcessos extends ListActivity {
  protected static final int INSERIR_EDITAR = 1;
  protected static final int BUSCAR = 2;
  public static RepositorioProcesso repositorio;
    private List<Processo> processos;
    @Override
    public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      repositorio = new RepositorioProcesso(this);
      atualizarLista();
}
protected void atualizarLista() {
    // Pega a lista de processos e exibe na tela
    processos = repositorio.listarProcessos();
    // Adaptador de lista customizado para cada linha de um processo
    setListAdapter(new ProcessoListAdapter(this, processos));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(0, INSERIR_EDITAR, 0, "Inserir Novo").setIcon(R.drawable.novo);
    menu.add(0, BUSCAR, 0, "Buscar").setIcon(R.drawable.pesquisar);
    return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    // Clicou no menu
    switch (item.getItemId()) {
        case INSERIR_EDITAR:
            // Abre a tela com o formulario para adicionar
            startActivityForResult(new Intent(this, EditarProcesso.class),        INSERIR_EDITAR);
            break;
        case BUSCAR:
            // Abre a tela para buscar o processo pelo nome
            startActivity(new Intent(this, BuscarProcesso.class));
            break;
    }
    return true;
}
@Override
protected void onListItemClick(ListView l, View v, int posicao, long id) {
    super.onListItemClick(l, v, posicao, id);
    editarProcesso(posicao);
}
// Recupera o id do processo, e abre a tela de edicao
protected void editarProcesso(int posicao) {
    // Usuario clicou em algum processo da lista e
    // Recupera o processo selecionado
    Processo processo = processos.get(posicao);
    // Cria a intent para abrir a tela de editar
    Intent it = new Intent(this, EditarProcesso.class);
    // Passa o id do processo como parametro
    it.putExtra(Processos._ID, processo.id);
    // Abre a tela de edicao
    startActivityForResult(it, INSERIR_EDITAR);
}
@Override
protected void onActivityResult(int codigo, int codigoRetorno, Intent it) {
    super.onActivityResult(codigo, codigoRetorno, it);
    // Quando a activity EditarCurriculo retornar, seja se foi para adicionar vamos atualizar a lista
    if (codigoRetorno == RESULT_OK) {
        // atualiza a lista na tela
        atualizarLista();
    }
}
@Override
protected void onDestroy() {
    super.onDestroy();
    // Fecha o banco
    repositorio.fechar();
}
}

2 answers

2

CadastroProcesso is an Activity. You are playing with one of her variables through another Activity. This is extremely not recommended on Android. The same goes for static Activities members.

In your specific case, the variable repositorio does not exist at the time you tried to access it because it was never created a copy of the class CadastroProcesso. When you want a screen to do something, you pass a message to it through a Bundle at the time of creation (or as a response to the screen that called it).

You need to rethink how your application works.

0


The solution I found was:

Declare the Repository process of the private type in each class:

private RepositorioProcesso repositorio;

Always initialize it in the onCreate of each class:

repositorio = new RepositorioProcesso(this);

And on line 76 of the class Novoprocesses, which was written as follows:

protected void salvarProcesso(Processo processo) {
  CadastroProcessos.repositorio.salvar(processo);
}

Replace by the code below:

protected void salvarProcesso(Processo processo) {
    repositorio.salvar(processo);
}

With this adjustment the application ran correctly without error

Browser other questions tagged

You are not signed in. Login or sign up in order to post.