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á.
NullPointerException
15 Respostas
Aonde que ele esta lançando a exception?
No exemplo que eu enviei está na linha 7.
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.
Hum não consigo identificar nenhum dos casos por exemplo eu uso três classes para fazer isso:
Ordem de acesso: [principal -> componente -> opcoes]
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);
}
}
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;
}
}
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);
}
}
}
coluna = componente.getTabela().getColumnModel().getColumn(3); // linha do erro
Use o depurador.
Sua tabela tem mesmo 4 colunas? Eu aposto que esse getColumn(3) está retornando null.
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.
Use o depurador.
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.
Coloca isso daqui antes do if: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:Aonde você ver que sair null, você conserta isso no seu código.System.out.println(componente); System.out.println(componente.getTabela()); System.out.println(componente.getTabela().getColumnModel()); System.out.println(componente.getTabela().getColumnModel().getColumn(3));
private JTable tabela;
public Componente() {
}
public JTable getTabela() {
return this.tabela;
}
public void setTabela(JTable tabela) {
this.tabela = tabela;
}
public void enviaTabela() {
elementoTabela.setTabela(tabelaPrincipal);
}
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.
Em nenhum momento a tabela da classe componente é inicializada. Isso que está gerando o NullPointerException
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.
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.
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!
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 []