NullPointerException

15 respostas
Onimatsu

Fala rapaziada blz.
Necessito de uma ajuda para corrigir um erro de NullPointerException segue o código: //private TableColumn coluna; //private TableColumn coluna = null; private TableColumn coluna = new TableColumn(); private void exibirColunaDeSenhasActionPerformed(java.awt.event.ActionEvent evt) { if (exibirColunaDeSenhas.isSelected()) { //TabbleColumn coluna = componente.getTabela().getColumnModel().getColumn(3); coluna = componente.getTabela().getColumnModel().getColumn(3); // linha do erro componente.getTabela().getColumnModel().removeColumn(componente.getTabela().getColumnModel().getColumn(3)); } else { componente.getTabela().getColumnModel().addColumn(coluna); } } Como pode ser visto nos comentários tentei de diversas maneiras iniciar a varíavel coluna mas nenhum sucesso. Como eu posso corrigir a exception?
Agradeço desde já.

15 Respostas

S

Aonde que ele esta lançando a exception?

Onimatsu

No exemplo que eu enviei está na linha 7.

csr_

Oi Onumatsu.

Pelo que vejo do código, existem as seguintes possibilidades:

  • O componente ser null.
  • O getTabela retornar null.
  • O getColumnModel ser null

Verifique qual o caso, que vc conseguirá resolver.

Aproveitando, eu também tinha muito problema com NullPointerException, até descobrir a lei de demeter, isso me ajudou bastante a diminuir os erros.

Até mais.

Onimatsu

Hum não consigo identificar nenhum dos casos por exemplo eu uso três classes para fazer isso:
Ordem de acesso: [principal -> componente -> opcoes]

1-principal
package br.com.nomedoprograma.visao;

import br.com.nomedoprograma.modelo.Componente;
import javax.swing.JTable;

public class Principal extends javax.swing.JFrame {

    private ComponentesEspeciais componenteFiltro;
    private Componente elementoTabela;

    public Principal() {
        initComponents();
        elementoTabela = new Componente();
    }

    // envia a varíavel private tabelaPrincipal
    // tabelaPrincipal é o nome da varíavel da tabela gerada automáticamente pelo netBeans com o uso de swing
    public void enviaTabela() {
        elementoTabela.setTabela(tabelaPrincipal);
    }
}
2-Componente
package br.com.nomedoprograma.modelo;

import javax.swing.JTable;

public class Componente {

    private JTable tabela;

    public Componente() {
    }

    public JTable getTabela() {
        return tabela;
    }

    public void setTabela(JTable tabela) {
        this.tabela = tabela;
    }
}
3-opcoes
package br.com.nomedoprograma.visao;

import br.com.nomedoprograma.modelo.Componente;
import javax.swing.JTable;
import javax.swing.table.TableColumn;


public class Opcoes extends javax.swing.JDialog {

    private TableColumn coluna = new TableColumn;
    private Componente componente = new Componente();

    public Opcoes() {
        initComponents();
        this.setLocationRelativeTo(null);
        this.setModal(true);
        this.setVisible(true);
    }

    /** Creates new form Opcoes */
    public Opcoes(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
	GeneratedCode                                    

    private void exibirColunaActionPerformed(java.awt.event.ActionEvent evt) {                                                     
        if (exibirColuna.isSelected()) {
            coluna = componente.getTabela().getColumnModel().getColumn(3); // salva o modelo da coluna em uma variável
            componente.getTabela().getColumnModel().removeColumn(componente.getTabela().getColumnModel().getColumn(3));
        } else {
            componente.getTabela().getColumnModel().addColumn(coluna); 
        }
    } 
}
O exemplo que eu passei antes e a classe opcoes. O problema está entre essas três classes mas suponho que seja na linha abaixo pois dessa parte em diante desencadeou uma série de erros NullPointerException.
coluna = componente.getTabela().getColumnModel().getColumn(3); // linha do erro
ViniGodoy

Use o depurador.

Sua tabela tem mesmo 4 colunas? Eu aposto que esse getColumn(3) está retornando null.

Onimatsu

ViniGodoy:
Use o depurador.

Sua tabela tem mesmo 4 colunas? Eu aposto que esse getColumn(3) está retornando null.


Sim a minha tabela têm 4 colunas mas eu mudei para coluna 1 para fazer o teste no debug mas mesmo assim depois que ele entra no if e passa para aquela linha já mencionada o programa da erro.
Para enviar o valor da tabelaPrincipal eu estou usando aquele principio em que você me ajudou mais cedo.

ViniGodoy

Use o depurador.

S

Coloca isso daqui antes do if:

System.out.println(componente);
System.out.println(componente.getTabela());
System.out.println(componente.getTabela().getColumnModel());
System.out.println(componente.getTabela().getColumnModel().getColumn(3));

Aonde você ver que sair null, você conserta isso no seu código.

Onimatsu
Sem_Nome:
Coloca isso daqui antes do if:
System.out.println(componente);
System.out.println(componente.getTabela());
System.out.println(componente.getTabela().getColumnModel());
System.out.println(componente.getTabela().getColumnModel().getColumn(3));
Aonde você ver que sair null, você conserta isso no seu código.
Eu fiz esse teste agora e ficou assim: System.out.println(componente); != null então está OK o problema é o getTabela esse sim está retornando nulo. Mas mesmo que eu saiba a origem do erro não consigo corrigi-lo getTabela é um método da classe Componente:
private JTable tabela;

    public Componente() {
    }

    public JTable getTabela() {
        return this.tabela;
    }
Mas se o erro tiver origem no set:
public void setTabela(JTable tabela) {
        this.tabela = tabela;
    }
Ou talvez esteja no método da classe Principal:
public void enviaTabela() {  
        elementoTabela.setTabela(tabelaPrincipal);  
    }
Não consigo identificar parece tudo certo desde a origem até o getTabela. Onde ficou o erro?
S

Meu conhecimento de Swing é tão bom quanto meu conhecimento sobre fisica nuclear (ou seja, quase zero).

Tenta dar um new no seu JTable dentro do construtor.

public Componente() {  
tabela = new JTable();
}

Considerando que, só exista esse metodo construtor da classe Componente.

S

Em nenhum momento a tabela da classe componente é inicializada. Isso que está gerando o NullPointerException

Onimatsu

Quando você diz para inciar a tabela da classe componente seria o mesmo que private JTable tabela = new JTable(); ? Se eu tentar fazer isso ele fica com erro java.lang.ArrayIndexOutOfBoundsException: 3 >= 0 e não chega a classe Opcoes.

S

Ah, esqueci o “tabelaPrincipal” que está na classe principal. Será que não são as colunas do JTable feito pelo NetBeans que estão dando NullPointerException? Eu geralmente prefiro fazer o swing todo na mão para evitar problemas com as ferramentas automáticas.

MinhaTabelaModel tabelaModel = new MinhaTabelaModel(); JTable tabela = new JTable(tabelaModel);

em MinhaTabelaModel já defino quantas colunas terá a minha tabela.

criador

ViniGodoy

Levando em consideração que o Onimatsu falou que a linha que está dando NullPointerException é a linha 07, é óbvio que não é o getColumn(3) o problema!!!

Abraço!

adriano_si

Cara, se eu bem entendi, na sua classe Opcoes vc reinicia seu componente com um new Componente().

Em momento algum vc preenche a tabela da sua classe Principal na sua classe Opcoes.

Não sei se entendi errado, mas a classe Principal me pareceu inutil nesse caso, você não a está usando em lugar nenhum.

Quando cria seu JDialog, a tabela que foi setada no seu frame não foi passada para o Dialog, logo não existe JTable setada no campo tabela da classe Componente.

Espero ter sido claro.

Abs []

Criado 23 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 15
Participantes 7