Erro java.lang.NullPointerException - ajuda para entender onde devo mudar

Seguem meus arquivos.
Tenho o arquivo mostrar.jsp que mostra o conteúdo da tabela e numa das colunas tem o link para a rotina de exclusão só que tá dando o erro java.lang.NullPointerException.
Acho que não estou conseguindo passar o parâmetro do contato pela rotina. Por favor, ajudem. Estou iniciando em jsf.
valeu

[code]ContatosDAO.java

package agenda.dao;
import agenda.model.Contatos;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class ContatosDAO implements InterfaceContatosDAO {
private Connection conn;
private String Contato;
public ContatosDAO() throws ContatosDAOException {
try {
this.conn = ConnectContatosFactory.getConnection();
} catch (Exception e) {
throw new ContatosDAOException(“Erro” + “:\n” + e.getMessage());
}
}
public void salvar(Contatos contato) throws ContatosDAOException {
PreparedStatement ps = null;
Connection conn = null;
if(contato == null)
throw new ContatosDAOException(“O Valor passado não pode ser lido”);
try {
String sql = “insert into registros(nome,endereco,bairro,cidade,estado,cep,telefone)” + “values(?,?,?,?,?,?,?)”;
conn = this.conn;
ps = conn.prepareStatement(sql);
ps.setString(1, contato.getNome());
ps.setString(2, contato.getEndereco());
ps.setString(3,contato.getBairro());
ps.setString(4, contato.getCidade());
ps.setString(5, contato.getEstado());
ps.setString(6, contato.getCep());
ps.setString(7, contato.getTelefone());
ps.executeUpdate();
} catch (Exception sqle) {
throw new ContatosDAOException(“Erro ao inserir dados” + sqle);
}finally{
ConnectContatosFactory.closeConnection(conn, ps);
}
}
public List listarTodos() throws ContatosDAOException {
PreparedStatement ps = null;
Connection conn = null;
ResultSet rs = null;
try {
conn = this.conn;
ps = conn.prepareStatement(“select id,nome,endereco,bairro,” + “cidade,estado,cep,telefone from registros”);
rs = ps.executeQuery();
List list = new ArrayList();
while (rs.next()) {
int id = rs.getInt(1);
String nome = rs.getString(2);
String endereco = rs.getString(3);
String bairro = rs.getString(4);
String cidade = rs.getString(5);
String estado = rs.getString(6);
String cep = rs.getString(7);
String telefone = rs.getString(8);
list.add(new Contatos(id, nome, endereco, bairro, cidade, estado,
cep, telefone));
}
return list;
} catch (Exception sqle) {
throw new ContatosDAOException(sqle);
} finally {
ConnectContatosFactory.closeConnection(conn, ps, rs);
}
}
public void atualizar(Contatos contato) throws ContatosDAOException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void excluir(Contatos contato) throws ContatosDAOException {
/*throw new UnsupportedOperationException(“Not supported yet.”);
*/
PreparedStatement ps = null;
Connection conn = null;
// if(contato == null)
// throw new ContatosDAOException(“O Valor AAAAAAAAApassado não pode ser lido”);
try {
String sql = “delete from registros where nome=?”;
System.out.println(sql);
conn = this.conn;
ps = conn.prepareStatement(sql);
// String a = (contato.getNome());
ps.setString(1,contato.getNome());
ps.executeUpdate();
} catch (Exception sqle) {
throw new ContatosDAOException(“Erro ao excluir dados” + sqle);
}finally{
ConnectContatosFactory.closeConnection(conn, ps);
}
}

}

[/code]

mostrar.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<html>
    <f:view>
        <head>
            <f:loadBundle basename="agenda2.mensagens" var="msgs" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title><h:outputText value="#{msgs.Titulo}"/></title>
            <link rel="stylesheet" type="text/css" href="estilo.css">
        </head>
        <body>
            <h:form>
                <h3><h:outputText value="#{msgs.Titulo}"/></h3>
                <h:dataTable value="#{contatos.todos}" var="agenda"
                             border="0" headerClass="cabecalho"
                             rowClasses="linha1,linha2">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Id}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.id}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Nome}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.nome}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Endereco}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.endereco}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Bairro}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.bairro}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Cidade}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.cidade}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Estado}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.estado}"/>
                                            </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Cep}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.cep}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.Telefone}"
                                          />
                        </f:facet>
                        <h:outputText value="#{agenda.telefone}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Excluir"
                                          />
                        </f:facet>
                        <h:commandLink action="#{contatos.excluirContato}" value="Excluir" />
                    </h:column>
                </h:dataTable>
                <br />
                <h:commandLink action="#{contatos.novoContato}" value="Novo Contato" />
            </h:form>
        </body>
    </f:view>
</html>

[code]G:\novaagenda\src\java\agenda\control\ContatosController.java

package agenda.control;

import agenda.dao.ContatosDAO;
import agenda.dao.ContatosDAOException;
import agenda.dao.InterfaceContatosDAO;
import agenda.model.Contatos;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

public class ContatosController {

private Contatos contato;
private DataModel model;

public String novoContato() {
    this.contato = new Contatos();
    return "novo";
}

public Contatos getContato() {
    return contato;
}

public void setContato(Contatos contato) {
    this.contato = contato;
}

public DataModel getTodos() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    model = new ListDataModel(icdao.listarTodos());
    return model;
}

public String create() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    icdao.salvar(contato);
    return "sucesso_ins";
}
public String excluirContato() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    icdao.excluir(this.contato);
    return "excluido";
}

// Aqui acrescentaremos os métodos para Atualização e Exclusão.
}

[/code]

Vou te pedir dois favores:

  1. Formata seu código no eclipse/netbeans e cola ele novamente entre as tags code. Fica mais fácil para ler o código (pelo menos para mim).
  2. Cola um stack para nós ai.

Segue aí.
valeu

[code]
mostrar.jsp
<%@page contentType=“text/html”%>
<%@page pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>


[/code]

[code]
ContatosDAO.java
package agenda.dao;

import agenda.model.Contatos;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class ContatosDAO implements InterfaceContatosDAO {

private Connection conn;
private String Contato;

public ContatosDAO() throws ContatosDAOException {
    try {
        this.conn = ConnectContatosFactory.getConnection();
    } catch (Exception e) {
        throw new ContatosDAOException("Erro" + ":\n" + e.getMessage());
    }
}

public void salvar(Contatos contato) throws ContatosDAOException {
    PreparedStatement ps = null;
    Connection conn = null;
    if (contato == null) {
        throw new ContatosDAOException("O Valor passado não pode ser lido");
    }
    try {
        String sql = "insert into registros(nome,endereco,bairro,cidade,estado,cep,telefone)" + "values(?,?,?,?,?,?,?)";
        conn = this.conn;
        ps = conn.prepareStatement(sql);
        ps.setString(1, contato.getNome());
        ps.setString(2, contato.getEndereco());
        ps.setString(3, contato.getBairro());
        ps.setString(4, contato.getCidade());
        ps.setString(5, contato.getEstado());
        ps.setString(6, contato.getCep());
        ps.setString(7, contato.getTelefone());
        ps.executeUpdate();
    } catch (Exception sqle) {
        throw new ContatosDAOException("Erro ao inserir dados" + sqle);
    } finally {
        ConnectContatosFactory.closeConnection(conn, ps);
    }
}

public List listarTodos() throws ContatosDAOException {
    PreparedStatement ps = null;
    Connection conn = null;
    ResultSet rs = null;
    try {
        conn = this.conn;
        ps = conn.prepareStatement("select id,nome,endereco,bairro," + "cidade,estado,cep,telefone from registros");
        rs = ps.executeQuery();
        List list = new ArrayList();
        while (rs.next()) {
            int id = rs.getInt(1);
            String nome = rs.getString(2);
            String endereco = rs.getString(3);
            String bairro = rs.getString(4);
            String cidade = rs.getString(5);
            String estado = rs.getString(6);
            String cep = rs.getString(7);
            String telefone = rs.getString(8);
            list.add(new Contatos(id, nome, endereco, bairro, cidade, estado,
                    cep, telefone));
        }
        return list;
    } catch (Exception sqle) {
        throw new ContatosDAOException(sqle);
    } finally {
        ConnectContatosFactory.closeConnection(conn, ps, rs);
    }
}

public void atualizar(Contatos contato) throws ContatosDAOException {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void excluir(Contatos contato) throws ContatosDAOException {
    /*throw new UnsupportedOperationException("Not supported yet.");
     */
    PreparedStatement ps = null;
    Connection conn = null;
    try {
        String sql = "delete from registros where nome=?";
        System.out.println(sql);
        conn = this.conn;
        ps = conn.prepareStatement(sql);
        ps.setString(1, contato.getNome());
        ps.executeUpdate();
    } catch (Exception sqle) {
        throw new ContatosDAOException("Erro ao excluir dados" + sqle);
    } finally {
        ConnectContatosFactory.closeConnection(conn, ps);
    }
}

}[/code]

[code]
ContatosController.java
package agenda.control;

import agenda.dao.ContatosDAO;
import agenda.dao.ContatosDAOException;
import agenda.dao.InterfaceContatosDAO;
import agenda.model.Contatos;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

public class ContatosController {

private Contatos contato;
private DataModel model;

public String novoContato() {
    this.contato = new Contatos();
    return "novo";
}

public Contatos getContato() {
    return contato;
}

public void setContato(Contatos contato) {
    this.contato = contato;
}

public DataModel getTodos() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    model = new ListDataModel(icdao.listarTodos());
    return model;
}

public String create() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    icdao.salvar(contato);
    return "sucesso_ins";
}

public String excluirContato() throws ContatosDAOException {
    InterfaceContatosDAO icdao = new ContatosDAO();
    icdao.excluir(this.contato);
    return "excluido";
}

}[/code]

Erro que ocorre quando clico em “Excluir” no arquivo mostrar.jsp

[code]
Stack

HTTP Status 500 -


type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{contatos.excluirContato}: agenda.dao.ContatosDAOException: Erro ao excluir dadosjava.lang.NullPointerException
root cause

javax.faces.FacesException: #{contatos.excluirContato}: agenda.dao.ContatosDAOException: Erro ao excluir dadosjava.lang.NullPointerException
root cause

javax.faces.el.EvaluationException: agenda.dao.ContatosDAOException: Erro ao excluir dadosjava.lang.NullPointerException
root cause

agenda.dao.ContatosDAOException: Erro ao excluir dadosjava.lang.NullPointerException[/code]

Só um chute. Sabe esse trecho de código no controller?

public String excluirContato() throws ContatosDAOException {   
        InterfaceContatosDAO icdao = new ContatosDAO();   
        icdao.excluir(this.contato);   
        return "excluido";   
    } 

A variável contato tem alguma coisa? Pelo menos no código que você mandou, não há nenhum lugar que seta essa variável. E como você manda nulo pro DAO, estoura a exceção.

Tenta fazer assim pra ver o erro:

    public void excluir(Contatos contato) throws ContatosDAOException {
        /*throw new UnsupportedOperationException("Not supported yet.");
         */
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String sql = "delete from registros where nome=?";
            System.out.println(sql);
            conn = this.conn;
            if(conn == null) System.out.println("conn nulo!");
            ps = conn.prepareStatement(sql);
            if(ps == null) System.out.println("ps nulo!");
            if(contato == null) System.out.println("contato nulo!");
            if(contato.getNome() == null) System.out.println("nome do contato nulo!");
            ps.setString(1, contato.getNome());
            ps.executeUpdate();
        } catch (Exception sqle) {
            throw new ContatosDAOException("Erro ao excluir dados" + sqle);
        } finally {
            ConnectContatosFactory.closeConnection(conn, ps);
        }
    }
}

Fiz o que o ivo costa disse mas deu o mesmo erro, não acusei quais das variáveis é nula.
Acho que é o que o Leonardo falou só que não sei como ajustar.

Eu me baseei no código de inserção de registro que é assim:

[code]link na página mostrar.jsp
<h:commandLink action="#{contatos.novoContato}" value=“Novo Contato” />

no ContatosController.java tá assim:

public String novoContato() {
this.contato = new Contatos();
return “novo”;
}

esse ‘return novo’ joga para a página InserirContato.jsp, nessa página tem os campos certinhos e o botão para confirmar assim:
<h:commandButton value=“Cadastrar” action="#{contatos.create}" />

esse ‘create’ está em ContatosController.java assim:

public String create() throws ContatosDAOException {
InterfaceContatosDAO icdao = new ContatosDAO();
icdao.salvar(contato);
return “sucesso_ins”;
}

e esse salvar está em InterfaceContatosDAO.java assim:

void salvar (Contatos contato)throws ContatosDAOException;

e está em ContatosDAO.java assim:

public void salvar(Contatos contato) throws ContatosDAOException {
PreparedStatement ps = null;
Connection conn = null;
if (contato == null) {
throw new ContatosDAOException(“O Valor passado não pode ser lido”);
}
try {
String sql = “insert into registros(nome,endereco,bairro,cidade,estado,cep,telefone)” + “values(?,?,?,?,?,?,?)”;
conn = this.conn;
ps = conn.prepareStatement(sql);
ps.setString(1, contato.getNome());
ps.setString(2, contato.getEndereco());
ps.setString(3, contato.getBairro());
ps.setString(4, contato.getCidade());
ps.setString(5, contato.getEstado());
ps.setString(6, contato.getCep());
ps.setString(7, contato.getTelefone());
ps.executeUpdate();
} catch (Exception sqle) {
throw new ContatosDAOException(“Erro ao inserir dados” + sqle);
} finally {
ConnectContatosFactory.closeConnection(conn, ps);
}
}
[/code]

O que acontece é o seguinte, o mostrar.jsp faz a consulta no sql e mostra os dados, aí numa das colunas tem o link excluir assim:

   <h:commandLink action="#{contatos.excluirContato}" value="Excluir" />[/code]

aí fiz a adaptação igualzinho o novoContato

[code]ContatosController.java

public String excluirContato() throws ContatosDAOException {
        InterfaceContatosDAO icdao = new ContatosDAO();
        icdao.excluir(contato);
        return "excluido";
    }

que chama o excluir em:

ContatosDAO.java

public void excluir(Contatos contato) throws ContatosDAOException {
        /*throw new UnsupportedOperationException("Not supported yet.");
         */
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String sql = "delete from registros where nome=?";
            System.out.println(sql);
            conn = this.conn;
            ps = conn.prepareStatement(sql);
            ps.setString(1, contato.getNome());
            ps.executeUpdate();
        } catch (Exception sqle) {
            throw new ContatosDAOException("Erro ao excluir dados" + sqle);
        } finally {
            ConnectContatosFactory.closeConnection(conn, ps);
        }
    }

Acho que o erro está na hora de passar o contato ativo no link como parâmetro pois quando é novo tudo bem, não precisa de nada mas quando se quer excluir precisamos de algum dado do registro a ser excluído para jogar no código sql.
Acho que a pergunta melhor seria, a partir de uma consulta em sql, como passar o parâmetro id do registro para a classe java?
Estou fazendo em JSf com managed bean, só para citar.
aguardo sugestões, valeu