[RESOLVIDO] Tratamento de erro NullPointerException

Boa noite pessoal,

Estou tendo dificuldade para tratar de um erro que talvez até seja banal, mas não estou conseguindo identificar o problema.
Sendo assim, peço ajuda de vocês para identificar e me ajudar a tratar dele.

O erro é o seguinte:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at entidades.FramePesquisa.btnPesquisarMouseClicked(FramePesquisa.java:239)
	at entidades.FramePesquisa.access$100(FramePesquisa.java:19)
	at entidades.FramePesquisa$2.mouseClicked(FramePesquisa.java:108)
	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
	at java.awt.Component.processMouseEvent(Component.java:6530)

Vi que o erro ocorre na linha 239 do código(abaixo):

Connection con = Conexao.abrirConexao(); 
            PesquisaDAO pd = new PesquisaDAO(con); 
            List<PesquisaBean> listaPb = new ArrayList<PesquisaBean>(); 
            listaPb = pd.listar(this.txtNome.getText());
                    
            DefaultTableModel tbm = (DefaultTableModel)tblConsulta.getModel();         
            for(int i = tbm.getRowCount()-1; i >= 0; i--){ 
                tbm.removeRow(i); 
            }
            
            int i = 0; 
            for(PesquisaBean pbLista : listaPb){   // ESTA É A LINHA 239          
                JOptionPane.showMessageDialog(null, pbLista.getNome()+" - "+pbLista.getResponsavel());
                tbm.addRow(new String[1]); 
                tblConsulta.setValueAt(pbLista.getNome(), i, 0); 
                tblConsulta.setValueAt(pbLista.getResponsavel(), i, 1);
                  
                i++; 
            } 
            
            Conexao.fecharConexao(con); 

Este é meu DAO:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class PesquisaDAO {
    private Connection con; 
    
    public PesquisaDAO(Connection con){ 
        setCon(con); 
    } 
    
    public Connection getCon() { 
        return con; 
    } 
    
    public void setCon(Connection con) { 
        this.con = con; 
    }
    
    //**********************************************************************
    
    public List<PesquisaBean> listar(String nome) {
        String sql = "SELECT responsavel AS nome, 'Sim' AS responsavel"
                + " FROM responsavel"
                + " WHERE responsavel LIKE '%"+nome+"%'"
                + "  UNION all"
                + " SELECT nome, 'Não'"
                + " FROM composicao_familiar"
                + " WHERE nome LIKE '%"+nome+"%')";
        
        List<PesquisaBean> lista = new ArrayList<PesquisaBean>();
        
        try {
            PreparedStatement ps = getCon().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            
            if (rs != null) { 
                while (rs.next()) {
                    PesquisaBean pb = new PesquisaBean();
                    pb.setNome(rs.getString("nome"));
                    pb.setResponsavel("responsavel");
                    lista.add(pb); 
                    
                }               
                return lista; 
            } else { 
                return null; 
            } 
        } catch (SQLException e) { 
            return null; 
        }
    }
}

E este o Bean:

public class PesquisaBean {
    private String nome;
    private String responsavel;

    
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(String responsavel) {
        this.responsavel = responsavel;
    }
    
    
}

Coloquei o trecho do Frame que gera o erro (FramePesquisa), o Bean (PesquisaBean) e o DAO (PesquisaDAO) para que não falte nenhum dado para análise de quem tentar me ajudar.

Se alguém precisa de mais alguma informação, avise que eu posto.

Agradeço desde já qualquer ajuda.

Att.
Rodrigo

Você intancia a lista antes, até aí tudo bem, mas o problema está aqui:

 listaPb = pd.listar(this.txtNome.getText());

Nessa hora listaPb está recebendo null novamente. Parece que seu método listar está retornando null. Teste o método. Veja se está conectando no banco direito, se a query está retornando certo. Debug ou coloque System.out.println()'s em cada passo e vá acompanhando.

Valeu ErickRAR!

Já resolvi o problema.

O problema ocorria por falta de atenção na hora de criar a query de consulta.

Estava assim:

String sql = "SELECT responsavel AS nome, 'Sim' AS responsavel"
                + " FROM responsavel"
                + " WHERE responsavel LIKE '%"+nome+"%'"
                + "  UNION all"
                + " SELECT nome, 'Não'"
                + " FROM composicao_familiar"
                + " WHERE nome LIKE '%"+nome+"%')";  // TEM UMA ) AQUI, FOI SÓ TIRA-LA

Abs.

Seu código do DAO poderia ser muito melhorado com algumas práticas.

No caso do SQLException, o ideal seria disparar uma exceção não verificada. Assim, qunado sua query tiver um problema, você ficará sabendo onde e qual problema:

catch (SQLException e) { throw new RuntimeException(e); }

Outra possibilidade seria gerar um log disso (chamando e.printStackTrace() ou usando alguma API de log), nunca descartar a exceção.

Não é necessário fazer um if testando se o comando executeQuery() retornou null. Esse comando nunca retorna null. Isso está bastante explícito inclusive na documentação:

[quote=“JavaDoc da classe PreparedStatement”]Returns:
a ResultSet object that contains the data produced by the query; never null[/quote]

Finalmente, a idéia de usar PreparedStatements é justamente não concatenar valores como você faz. Caso você faça isso, usar procurar um nome como “MacDonald’s” vai causar desgraça em seu sistema (para não falar, abrir a possibilidade para SQL Injection).

Você deve trocar a query para:

String sql = "SELECT responsavel AS nome, 'Sim' AS responsavel" + " FROM responsavel" + " WHERE responsavel LIKE ?" + " UNION all" + " SELECT nome, 'Não'" + " FROM composicao_familiar" + " WHERE nome LIKE ?')"; // TEM UMA ) AQUI, FOI SÓ TIRA-LA

E então, fazer:

PreparedStatement ps = getCon().prepareStatement(sql); ps.setString(1, "%" + nome "%"); ps.setString(2, "%" + nome "%"); ResultSet rs = ps.executeQuery();

Opa, muito obrigado pelas dicas ViniGodoy.

Como eu havia dito: sou iniciante ainda na linguagem e estou pegando aos poucos os macetes.
Sempre é bom umas dicas assim claras como você deu!

Já implementei as dicas passadas.

Grato!

[quote=DarkSun]Opa, muito obrigado pelas dicas ViniGodoy.

Como eu havia dito: sou iniciante ainda na linguagem e estou pegando aos poucos os macetes.
Sempre é bom umas dicas assim claras como você deu!

Já implementei as dicas passadas.

Grato![/quote]

Beleza, estamos aqui para ajudar mesmo!

Face the fire of the Dark Sun. A world ravaged by a sorcerer!