Erro setter em ComboBox para addItem

13 respostas
guilherme.dio

Estou com uma classe auxiliar, onde possuo como atributo um ComboBox, e tenho 1 setter e um getter:

public class Peças
{
    private javax.swing.JComboBox peças;

    // <editor-fold defaultstate="collapsed" desc="Setter/Getter">
    public void setPeça(String peça)
    {
        this.peças.addItem(peça);
    }
    public javax.swing.JComboBox getPeças()
    {
        return this.peças;
    }
    // </editor-fold>
}

E tbm tenho uma classe de comandos no BD, odne faço o set na classe do ComboBox, porém quando chega no set, ele só é executaod uma vez, na segunda vez da eror e vai pro catch:

public Auxiliar.Peças consultaPeças(String tabela)
    {
        Auxiliar.Peças objPeças=new Auxiliar.Peças();
        Statement consulta;
        ResultSet retorno;
        String comando = "SELECT nome FROM "+tabela;
        try
        {
            consulta=conn.createStatement();
            retorno=consulta.executeQuery(comando);
            while(retorno.next())
            {
                objPeças.setPeça(retorno.getString("nome"));
            }
            consulta.close();
            retorno.close();
        }
        catch(Exception e)
        {
            System.out.println("Erro: consultaPeças()\n"+e.getCause());
        }
        return objPeças;
    }

Alguém tem idéia do que pode estar causando o erro?

13 Respostas

rafaelbortoletto

sem a mensagem de erro exata é difícil saber o problema. Mas, na documentação do Java diz que você pode ter problemas se adicionar objetos string duplicados.

http://download.oracle.com/javase/1,5.0/docs/api/javax/swing/JComboBox.html#addItem(java.lang.Object)

Veja se a explicação ajuda.

guilherme.dio

Acontece, que o erro gerado no catch é simplesmente “NULL” nada mais

rafaelbortoletto

Creio que o problema possa ser que o Nome da peça está como NULL no banco de dados por isso, ele dá esse problema. Você pode tentar substituir por uma string vazia ou por um nome do tipo “vazio”.

Em todo o caso, tente substituir o getCause por getMessage dentro do seu bloco catch ou use o printStackTrace() para saber um detalhe melhorado dessa exceção.

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Throwable.html#getMessage()

guilherme.dio

Mesmo o e.getMessage me diz NULL

guilherme.dio

será que não tem nada de errado com o tipo de retorno desse metodo?

porque se não for isso, entao nao sei, pq fiz o debug, e percebi que ele passa uma unica vez pelo setPeça, inclusive pega o nome d aprimeira peça no banco de dados e retorna porém na segunda vez nem passa pelo setter, vai direto pro catch…

e no meu BD n tem nenhum nome null

rafaelbortoletto

Então, tente executar o comando sql ( select nome from tabela ) no seu banco de dados e veja se algum nome está como NULL. Se estiver, você terá que alterar a coluna nome no banco de dados para not null e guardar um nome sempre que inserir um registro ou então, fazer a substituição usando o método replace da string substituindo o valor null por uma string vazia ou com o texto “vazio” por exemplo.

guilherme.dio

No printStackTrace, o primeiro item da lista é a classe auxiliar Peças, no método setPeça(String peça);

rafaelbortoletto

cole o printStackTrace todo aqui.

guilherme.dio
Erro: consultaPeças()
java.lang.NullPointerException
null
null
        at Auxiliar.Peças.setPeça(Peças.java:20)
        at Banco.Comandos_BD.consultaPeças(Comandos_BD.java:465)
        at Admin.consultar.ComboBox_nometabelaActionPerformed(consultar.java:247)
        at Admin.consultar.access$100(consultar.java:14)
        at Admin.consultar$2.actionPerformed(consultar.java:59)
        at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1240)
        at javax.swing.JComboBox.setSelectedItem(JComboBox.java:567)
        at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603)
        at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:817)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:481)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
rafaelbortoletto

Pelas mensagens de erro o problema pode estar no fechamento de conexões que é fechado antes da hora.

Tente comentar o código abaixo e veja se funciona

consulta.close();  
retorno.close();

Além disso, coloque o código de fechamento dentro de um finally para que seja executado corretamente.

fica assim

try{

// código
}catch(Exception e){

// tratamento de exceção

}
finally{

    consulta.close();  
    retorno.close(); 
}
guilherme.dio

Já tentei comentar as 2 linhas de fechar o Statement e o ResultSet mas não deu certo, ja tentei o bloco finally tbm não deu, estou desanimado agora, muito ,mesmo

de uma olhada nesse método actionPerformed de um ComboBox onde eu pego o item selecionado e mando pra classe comandos onde esta o metodo de consultaPeça, que ao retornar vai para esse metodo que vou postar:

private void ComboBox_nometabelaActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        Banco.Comandos_BD comandos=new Banco.Comandos_BD();
        this.jComboBox1=comandos.consultaPeças((String) this.ComboBox_nometabela.getSelectedItem()).getPeças();
    }

Agora esta certo a sequencia é essa

Admin_Consulta.actonPerformed -> Comandos.consultaPeça - > Auxiliar.Peça ->(retorna) Comandos.consultaPela ->(retorna) Admin_Consulta.actionPerformed

Se o erro não estiver ai, será que não é o tipo de retorno do consultaPeça()?

rafaelbortoletto

guilherme.dio:
Já tentei comentar as 2 linhas de fechar o Statement e o ResultSet mas não deu certo, ja tentei o bloco finally tbm não deu, estou desanimado agora, muito ,mesmo

de uma olhada nesse método actionPerformed de um ComboBox onde eu pego o item selecionado e mando pra classe comandos onde esta o metodo de consultaPeça, que ao retornar vai para esse metodo que vou postar:

private void ComboBox_nometabelaActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        Banco.Comandos_BD comandos=new Banco.Comandos_BD();
        this.jComboBox1=comandos.consultaPeças((String) this.ComboBox_nometabela.getSelectedItem()).getPeças();
    }

Agora esta certo a sequencia é essa

Admin_Consulta.actonPerformed -> Comandos.consultaPeça - > Auxiliar.Peça ->(retorna) Comandos.consultaPela ->(retorna) Admin_Consulta.actionPerformed

Se o erro não estiver ai, será que não é o tipo de retorno do consultaPeça()?

Bom, se executa pelo menos uma vez o erro certamente não está no tipo de retorno porque se estivesse ele não executaria. Agora, depende do que você executa quando seleciona a tabela para procurar pelos nomes pela segunda vez. Pois, se forem tabelas diferentes pode ser que em outra tabela não existam itens cadastrados ou até mesmo itens nulos na coluna nome como falado antes.

guilherme.dio

Resolvi, eu fiz um ArrayList, e no retorno.next fui criando um novo objPeça, setei no atributo Peça o retorno.getString(“nome”); e adicionei o objPeça no arrayList

retornei o arrayList, e fiz uma logica pra adicionar no ComboBox.

Criado 1 de maio de 2011
Ultima resposta 1 de mai. de 2011
Respostas 13
Participantes 2