Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Eu não consigo conectar com o banco de dados. Me desculpem pelo tamanho do código, mas prefiro passar ele completo. Obrigada desde já!

SEGUE O ERRO:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at com.fatec.bd.desconecta(bd.java:78)
	at com.fatec.frmCliente$2.focusLost(frmCliente.java:95)
	at java.awt.AWTEventMulticaster.focusLost(Unknown Source)
	at java.awt.Component.processFocusEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

CLASSE BANCO DE DADOS
import java.sql.*;

    public class bd{
    	   
        private Connection con;
    	private Statement stmt;
    	private boolean erro;
    	private String msg;
    	private String banco, usuario, senha;

          /* Método Construtor: inicializa alguns atributos do objeto
             Parâmetros: b-nome do banco de dados / u-nome o usuario / s-senha 
          */   
          public bd(String b, String u, String s){
    		 this.banco="jdbc:mysql://localhost/?autoReconnect=true&useSSL=false"+b;
    		 this.usuario=u;
    		 this.senha=s;
    		 erro=false;
    		 msg="";
    	 }
           /* Método conectaBD: realiza a conexão com o banco de dados
              Retorno: TRUE-conexão realizada / FALSE-falha na conexão 
           */ 
    	 public boolean conectaBD(){
    		 this.erro=false;
    	       try {
    		      Class.forName("com.mysql.jdbc.Driver");
                      con = DriverManager.getConnection(this.banco, this.usuario,
                                                                        this.senha);
    		      stmt=con.createStatement();
    		     }catch (SQLException e){this.erro=true;
    			  this.msg="Falha na conexao com o banco de dados!"; 
    			}
    		      catch (java.lang.Exception e){this.erro=true; 
    			     this.msg="Erro no driver de conexao!"; 
    			}
    		return !erro;      
    	}
          /* Método: consulta
             Parâmetro: c-comando SQL de consulta (SELECT)
             Retorno: objeto ResultSet com o resultado da consulta
          */ 
    	public ResultSet consulta (String c){
    		ResultSet res=null;
    		this.erro=false;
    		this.msg="Sucesso na execução da consulta!";
    		try{
    			res=stmt.executeQuery(c);
    		}catch (SQLException e){this.erro=true;
    		      this.msg="Falha na execução da consulta!";
    		 }
    		return res;
    	}
          /* Método: atualiza
             Parâmetro: c-comando SQL de atualização (INSERT, UPDATE, DELETE)
             Retorno: TRUE-comando executado com sucesso / FALSE-falha na execução
          */ 
    	public boolean atualiza(String c){
    		int i=-1;
    		this.erro=false;
    		this.msg="Operação realizada com sucesso!";
    		try{
    			i=stmt.executeUpdate(c);
    		}catch (SQLException e){
    			this.erro=true; 
    			this.msg="Falha na operação!";
                 }
    		return !erro;
    	}
          /* Método desconecta: fecha a conexão com o banco de dados
             Retorno: TRUE-desconexão realizada / FALSE-falha na desconexão
          */ 
    	public boolean desconecta(){
    		boolean sucesso=true;
    		try{
    			stmt.close();
    			con.close();
    		}catch(SQLException e){sucesso=false;}
    		return sucesso;
    	}
          /* Método ocorreuErro: retorna o valor do atributo erro
             Retorno: TRUE-ocorreu um erro durante uma operação 
                      FALSE-não ocorreu nenhum erro 
          */ 
    	public boolean ocorreuErro(){
    		return this.erro;
    	}
           /* Método mensagem: retorna o valor do atributo mensagem
              Retorno: Mensagem sobre um possível erro que possa ter ocorrido 
                        durante a realização de uma operação
           */ 
    	public String mensagem(){
    		return this.msg;
    	}
    }

CLASSE CLIENTE

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.JButton;

public class frmCliente extends JFrame {

private JPanel contentPane;

private JTextField txtCod_Cliente;
private JTextField txtCPF_Cliente;
private JTextField txtNome_Cliente;
private JTextField txtTelefone_Cliente;

private bd objBD;
private JButton btnSair;

/**

  • Launch the application.
    */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    frmCliente frame = new frmCliente();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }

/**

  • Create the frame.
    */
    public frmCliente() {
    setTitle(“Cadastro de Cliente”);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 468, 251);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    //conexao com bd

    objBD = new bd(“acmecar”, “root”, “”);

    JLabel lblCod_Cliente = new JLabel(“C\u00F3digo”);
    lblCod_Cliente.setHorizontalAlignment(SwingConstants.CENTER);
    lblCod_Cliente.setBounds(0, 0, 66, 16);
    contentPane.add(lblCod_Cliente);

    txtCod_Cliente = new JTextField();
    txtCod_Cliente.setColumns(10);
    txtCod_Cliente.setBounds(12, 24, 164, 20);
    contentPane.add(txtCod_Cliente);

    txtCod_Cliente.addFocusListener(new FocusAdapter() {
    @Override
    public void focusLost(FocusEvent arg0) {
    if (!objBD.conectaBD()){
    ExibeMensagem();
    } else {
    String sql = “select * from clientes where Cod_Cliente = " +
    txtCod_Cliente.getText().toString();
    ResultSet objRes = objBD.consulta(sql);
    try{
    if (objRes.next()){
    txtNome_Cliente.setText(objRes.getString(2));
    txtTelefone_Cliente.setText(objRes.getString(3));
    } else {
    txtNome_Cliente.setText(”");
    txtTelefone_Cliente.setText("");
    }
    } catch(SQLException e) {
    ExibeMensagem();
    }

     	} objBD.desconecta();					
     }
    
  	private void ExibeMensagem() {
  		// TODO Auto-generated method stub
  		
  	} 
  });
  
  //fimbd
  
  JLabel lblCPF_Cliente = new JLabel("CPF");
  lblCPF_Cliente.setVerticalAlignment(SwingConstants.BOTTOM);
  lblCPF_Cliente.setHorizontalAlignment(SwingConstants.LEFT);
  lblCPF_Cliente.setBounds(232, 0, 46, 16);
  contentPane.add(lblCPF_Cliente);
  
  txtCPF_Cliente = new JTextField();
  txtCPF_Cliente.setBounds(232, 24, 164, 20);
  contentPane.add(txtCPF_Cliente);
  txtCPF_Cliente.setColumns(10);
  
  JLabel lblNome_Cliente = new JLabel("Nome");
  lblNome_Cliente.setBounds(10, 76, 55, 16);
  contentPane.add(lblNome_Cliente);
  
  txtNome_Cliente = new JTextField();
  txtNome_Cliente.setBounds(12, 104, 164, 20);
  contentPane.add(txtNome_Cliente);
  txtNome_Cliente.setColumns(10);
  
  JLabel lblTelefone_Cliente = new JLabel("Telefone");
  lblTelefone_Cliente.setBounds(232, 76, 55, 16);
  contentPane.add(lblTelefone_Cliente);
  
  txtTelefone_Cliente = new JTextField();
  txtTelefone_Cliente.setBounds(232, 104, 164, 20);
  contentPane.add(txtTelefone_Cliente);
  txtTelefone_Cliente.setColumns(10);
  
  //inicio btnSalvar
  
  JButton btnSalvar = new JButton("Salvar");
  btnSalvar.addActionListener(new ActionListener() {
  	public void actionPerformed(ActionEvent e) {
  		if (!objBD.conectaBD()){
  			   ExibeMensagem();
  		   } else {
  			   String sql = "select * from clientes where Cod_Cliente = " + 
  		           txtCod_Cliente.getText().toString();
  			   ResultSet objRes = objBD.consulta(sql);
  			   try{
  				  
  				   if (objRes.next()){  // Alteracao
  					   sql = "UPDATE clientes SET Cod_Cliente = '" + txtCod_Cliente.getText().toString() +
  							   					"' Nome_Cliente = '" + txtNome_Cliente.getText().toString() +
  							   					"' Telefone_Cliente = '" + txtTelefone_Cliente.getText().toString() + "'" + 
  							   					"' CPF_Cliente = '" +txtCPF_Cliente.getText() .toString() +
  							 " WHERE Cod_Cliente = '" + txtCod_Cliente.getText().toString() + "'";
  				   } else {  //Inclusao
  						sql = "INSERT INTO clientes(Cod_Cliente, CPF_Cliente, Nome_Cliente, Telefone_Cliente) VALUES ('" +
  						txtCod_Cliente.getText().toString() + "', '" +
  						txtCPF_Cliente.getText().toString() + "', '" +
  						txtNome_Cliente.getText().toString() + "', '" +
  						txtTelefone_Cliente.getText().toString() + "')";
  				   }
   				   
  				   if (objBD.atualiza(sql)) {
   					   LimparCampos();
  				   } else {
  					   ExibeMensagem();
  				   }
   				   
  			   } catch(SQLException f){
  				   ExibeMensagem();
  			   }
  			   objBD.desconecta(); 
  		   }
  	}
  }); //fim botao salvar
  
  btnSalvar.setMnemonic('S');
  btnSalvar.setBounds(10, 179, 98, 26);
  contentPane.add(btnSalvar);
  
  //inicio botao excluir
  
  JButton btnExcluir = new JButton("Excluir");
  btnExcluir.addActionListener(new ActionListener() {
  	public void actionPerformed(ActionEvent e) {
  		if (!objBD.conectaBD()){
  			ExibeMensagem();
  		} else {
  			String sql = "delete from clientes where codtip = " +
  		           txtCod_Cliente.getText().toString();
  			if (objBD.atualiza(sql)){
  				LimparCampos();
  			} else {
  				ExibeMensagem();
  			}
  			objBD.desconecta();
  		} 
  	}
  });
  
  btnExcluir.setMnemonic('E');
  btnExcluir.setBounds(120, 179, 98, 26);
  contentPane.add(btnExcluir);
  
  //FIM BOTAO EXCLUIR
  
  JButton btnLimpar = new JButton("Limpar");
  btnLimpar.addActionListener(new ActionListener() {
  	public void actionPerformed(ActionEvent e) {
  		LimparCampos();
  	}
  });
  btnLimpar.setMnemonic('L');
  btnLimpar.setBounds(232, 179, 98, 26);
  contentPane.add(btnLimpar);
  
  JButton btnSair = new JButton("Sair");
  btnSair.addActionListener(new ActionListener() {
  	public void actionPerformed(ActionEvent e) {
  		setVisible(false);
  	}
  });
  btnSair.setBounds(342, 179, 98, 26);
  contentPane.add(btnSair);

}

private void LimparCampos() {
txtCod_Cliente.setText("");
txtCPF_Cliente.setText("");
txtNome_Cliente.setText("");
txtTelefone_Cliente.setText("");
}

private void ExibeMensagem() {
JOptionPane.showMessageDialog(null, objBD.mensagem(),
“Erro”, JOptionPane.ERROR_MESSAGE);
}

public JButton getBtnSair() {
return btnSair;
}

public void setBtnSair(JButton btnSair) {
this.btnSair = btnSair;
}
}

Tem alguma referência nula sendo acessada dentro do método desconecta, na classe bd. Só pode ser stmt ou con. Coloca um breakpoint ali e debuga pra ver o que é.

Olá, primeiramente agradeço por me responder. É a primeira vez que eu debugo algo, então não sei o que fazer. Tirei print da tela pra te mostrar o que está acontecendo. Espero que dê para entender. ):

No canto superior esquerdo, você tem a call stack. É, como o nome diz, a pilha de chamadas que foi feita até chegar no teu método. Se você ler ela ao contrário (de cima pra baixo), vai chegar até o evento que foi gerado pelo click na interface.

No canto superior direito, você vai ver o frame visível por essa thread nesse momento. Ali estão todas as referências que essa thread consegue ver, assim como seus valores. Você vai ver que as variáveis con e stmt estão como null. O erro está acontecendo na linha do .close(), mas caso passasse, ia acontecer um NullPointerException também na linha de baixo, porque o con também é null. Essa exceção acontece quando você tenta chamar um método em uma referência nula.

No canto inferior esquerdo tem o código, para você ir acompanhando a execução. No inferior direito, tem um outline da classe, mostrando de forma mais intuitiva métodos e variáveis para facilitar a navegação.

Tente descobrir porque stmt e con estão null.