[Resolvido]NullPointerException

12 respostas
filipi

Boa noite amigos,

Estou com um pequeno problema, tenho um método para busca no BD que funciona perfeitamente,porém quando filtro o select colocando o operador LIKE ele me retorna o seguinte erro
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

e aponta para o método que popula minha tabela,vou postar os dois métodos para ver se alguém consegue me ajudar com o erro.

Método da busca
public List<Clientes> buscaCliente(String nome)throws SQLException{
                List<Clientes> pesquisa = new ArrayList<>();
                
                String select = "select * from cliente where nome like %?%'";
                PreparedStatement state = getConnection().prepareStatement(select);
                state.setString(1,nome);
                ResultSet set = state.executeQuery();
                
                 while(set.next()){
                            Clientes cli = new Clientes();
                            cli.setId(set.getInt("id"));
                            cli.setNome(set.getString("nome"));
                            cli.setEnd(set.getString("endereco"));
                            cli.setTel(set.getString("telefone"));
                            cli.setRg(set.getInt("rg"));
                            cli.setCpf(set.getInt("cpf"));
                            pesquisa.add(cli);
            }
                 set.close();
                 state.close();
                 return pesquisa;
Método que popula tabela
private void mostrarLista(List<Clientes> cliente){
        
        DefaultTableModel modelo = (DefaultTableModel) jTab.getModel();
        
               
        for (int i = 0; i < cliente.size(); i++) {
            
            Clientes cli = cliente.get(i);
            
            modelo.addRow(new Object[]{"","","","","",""});
            
            jTab.setValueAt(cli.getNome(),i,0);
            jTab.setValueAt(cli.getEnd(),i,1);
            jTab.setValueAt(cli.getTel(),i,2);
            jTab.setValueAt(cli.getRg(),i,3);
            jTab.setValueAt(cli.getCpf(),i,4);
            jTab.setValueAt(cli.getId(),i,5);

Ele aponta exatamente na linha do FOR

Grato desde já

12 Respostas

lalau
filipi:
Boa noite amigos, Estou com um pequeno problema, tenho um método para busca no BD que funciona perfeitamente,porém quando filtro o select colocando o operador LIKE ele me retorna o seguinte erro
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

e aponta para o método que popula minha tabela,vou postar os dois métodos para ver se alguém consegue me ajudar com o erro.

Método da busca
public List<Clientes> buscaCliente(String nome)throws SQLException{
                List<Clientes> pesquisa = new ArrayList<>();
                
                String select = "select * from cliente where nome like %?%'";
                PreparedStatement state = getConnection().prepareStatement(select);
                state.setString(1,nome);
                ResultSet set = state.executeQuery();
                
                 while(set.next()){
                            Clientes cli = new Clientes();
                            cli.setId(set.getInt("id"));
                            cli.setNome(set.getString("nome"));
                            cli.setEnd(set.getString("endereco"));
                            cli.setTel(set.getString("telefone"));
                            cli.setRg(set.getInt("rg"));
                            cli.setCpf(set.getInt("cpf"));
                            pesquisa.add(cli);
            }
                 set.close();
                 state.close();
                 return pesquisa;
Método que popula tabela
private void mostrarLista(List<Clientes> cliente){
        
        DefaultTableModel modelo = (DefaultTableModel) jTab.getModel();
        
               
        for (int i = 0; i < cliente.size(); i++) {
            
            Clientes cli = cliente.get(i);
            
            modelo.addRow(new Object[]{"","","","","",""});
            
            jTab.setValueAt(cli.getNome(),i,0);
            jTab.setValueAt(cli.getEnd(),i,1);
            jTab.setValueAt(cli.getTel(),i,2);
            jTab.setValueAt(cli.getRg(),i,3);
            jTab.setValueAt(cli.getCpf(),i,4);
            jTab.setValueAt(cli.getId(),i,5);

Ele aponta exatamente na linha do FOR

Grato desde já

Saudações! Coloque a outra aspa simples ===>
String select = "SELECT * FROM cliente WHERE nome LIKE '%?%'";
talvez isso ajude.
filipi

Colocando a aspa simples ele cai na sql exception e fala

Parameter index out of range (1>0)

E na saida da o mesmo erro de NullPointerException

therodrigoagostin

NullPointerException geralmente é erro quando falta instanciar algo!

Dê uma olhada nessa parte do código:

Clientes cli = cliente.get(i);

tente algo como

Clientes cli = new Clientes();
cli = cliente.get(i);

ou talvez

List<Clientes> pesquisa = new ArrayList<>();

tente um:

List<Clientes> pesquisa = new ArrayList<Clientes>();

ou

List<Clientes> pesquisa = new ArrayList();
douglaskd

você deve chamar o método assim:

mostrarLista(buscaCliente(“jo”));

e o lançe das aspas também.

o erro que aqui: cliente.size(); por algum motivo cliente não esta instanciado, pois o método mostraLista esta recebendo ele vazio

filipi

Vou tentar fazer dessa maneira douglaskd,eu aviso o que rolou…Obrigado!

mateus.cordeiro

Amigo, não sei qual IDE vc usa, mas dá uma olhada como usa debug.
Assim vc mata onde ta o problema em qual linha.
Vc ganha tanto em experiencia como tempo!

drsmachado

lalau:

Saudações!
Coloque a outra aspa simples ===> String select = "SELECT * FROM cliente WHERE nome LIKE '%?%'";
talvez isso ajude.

Camarada, de onde tirou esse absurdo?
Quando se usa PreparedStatement com coringas (?), após o preparo da query e uso do setYyyy, temos a seguinte consulta (considere o nome ‘João’).

"SELECT * FROM cliente WHERE nome LIKE '%'Joao'%'";

Notou as aspas simples?
Isso acontece por que a função do setString (e dos demais set do PreparedStatement) é evitar injeção SQL e permitir a inclusão do parâmetro na consulta.
Como fazer?

String select = "select * from cliente where nome like ?";//Deixar apenas o coringa
...
state.setString(1,"%" + nome + "%");//Os sinais percentuais são colocados junto do parâmetro, deixando que o método setString faça o resto.
filipi

Muito obrigado drsmachado,funcionou aqui sua dica. Mais uma aprendida!

Algumas considerações finais :

Como o douglaskd comentou eu chamei o método dessa forma :

mostrarLista( cli.buscaCliente(txtBusca.getText()));

Antes estava fazendo assim

List<Clientes> list = cli.buscaCliente(txtBusca.getText());

mostrarLista(list);

Qual seria o correto?

A outra consideração seria que ficou uma duvida do que foi explicado pelo drsmachado. Se eu estivesse usando o Stament ao invés do PreparedStament eu poderia implementar da seguinte forma,ou estaria errado também?

String select = "select * from cliente where nome like '%?%'"

E não entendi o que quis dizer,quando disse que os set’s do PreparedStament servem para evitar um “injeção” do SQL.

Obrigado a todos que me ajudaram.

drsmachado

filipi:
Muito obrigado drsmachado,funcionou aqui sua dica. Mais uma aprendida!

Algumas considerações finais :

Como o douglaskd comentou eu chamei o método dessa forma :

mostrarLista( cli.buscaCliente(txtBusca.getText()));

Antes estava fazendo assim

List<Clientes> list = cli.buscaCliente(txtBusca.getText());

mostrarLista(list);

Qual seria o correto?


Tanto faz, da mesma forma você terá o objeto list sendo enviado (salvo se o retorno do método buscaCliente for nulo).

Se você utilizar esta query, com Statement, você está dizendo ao banco de dados que quer qualquer nome que tenha um ponto de interrogação. Isso, por que, não tem como substituir o coringa ‘?’ usando Statement.
A alternativa seria

String select = "select * from cliente where nome like '%" + nome + "%'";

O que traria problemas para os nomes como “Joana D’Arc” e permitiria SQL Injection.

filipi

Certo drsmachado agora ficou claro amigo,não utilizarei dessa forma, apenas da forma como me disse anteriormente. Muito obrigado!

lalau

drsmachado:
lalau:

Saudações!
Coloque a outra aspa simples ===> String select = "SELECT * FROM cliente WHERE nome LIKE '%?%'";
talvez isso ajude.

Camarada, de onde tirou esse absurdo?
Quando se usa PreparedStatement com coringas (?), após o preparo da query e uso do setYyyy, temos a seguinte consulta (considere o nome ‘João’).

"SELECT * FROM cliente WHERE nome LIKE '%'Joao'%'";

Notou as aspas simples?
Isso acontece por que a função do setString (e dos demais set do PreparedStatement) é evitar injeção SQL e permitir a inclusão do parâmetro na consulta.
Como fazer?

String select = "select * from cliente where nome like ?";//Deixar apenas o coringa ... state.setString(1,"%" + nome + "%");//Os sinais percentuais são colocados junto do parâmetro, deixando que o método setString faça o resto.

Obrigado pela correcção foi um erro meu.

drsmachado

lalau:
drsmachado:
lalau:

Saudações!
Coloque a outra aspa simples ===> String select = "SELECT * FROM cliente WHERE nome LIKE '%?%'";
talvez isso ajude.

Camarada, de onde tirou esse absurdo?
Quando se usa PreparedStatement com coringas (?), após o preparo da query e uso do setYyyy, temos a seguinte consulta (considere o nome ‘João’).

"SELECT * FROM cliente WHERE nome LIKE '%'Joao'%'";

Notou as aspas simples?
Isso acontece por que a função do setString (e dos demais set do PreparedStatement) é evitar injeção SQL e permitir a inclusão do parâmetro na consulta.
Como fazer?

String select = "select * from cliente where nome like ?";//Deixar apenas o coringa ... state.setString(1,"%" + nome + "%");//Os sinais percentuais são colocados junto do parâmetro, deixando que o método setString faça o resto.

Obrigado pela correcção foi um erro meu.


Opa, sem problemas.
Pude corrigir por já ter tentado fazer assim e ter tido a desagradável sensação de ter errado feio.

Criado 16 de julho de 2013
Ultima resposta 18 de jul. de 2013
Respostas 12
Participantes 6