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

5 respostas
L

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

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);
}
}

}
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>
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.
}

5 Respostas

khaoz

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.
L

Segue aí.
valeu

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>
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);
        }
    }
}
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";
    }
}

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

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
L

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.

ivo_costa

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);
        }
    }
}
L

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:

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

no ContatosController.java  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);
        }
    }

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" />

aí fiz a adaptação igualzinho o novoContato

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

Criado 15 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 5
Participantes 4