Application is returning NullPointerException error despite object being set

1

Error clicking save new process after assigning 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)

New Process Class

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);
}

}

Class Data RepositoryProcess

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;
}

ProcessCode Class

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();
}
}
    
asked by anonymous 30.11.2015 / 00:02

2 answers

0

The solution I found was:

Declare the RepositoryProcess of type private in each class:

private RepositorioProcesso repositorio;

Always initialize it in the onCreate of each class:

repositorio = new RepositorioProcesso(this);

And in line 76 of the class NewProcess, which was written as follows:

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

Replace with the code below:

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

With this setting the application ran correctly without error

    
02.12.2015 / 23:25
2

CadastroProcesso is an Activity. You are moving your variable through another Activity. This is extremely not recommended on Android. The same goes for Static members of Activities.

In your specific case, the repositorio variable does not exist the instant you tried to access it because a copy of the CadastroProcesso class was never created. 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.

    
30.11.2015 / 00:23