1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

NullPointerException JavaWeb com TomCat

Bom dia galera, estou seguindo a apostila da Caelum, (http://www.caelum.com.br/apostila-java-web/mvc-model-view-controller/#9-7-exercicios-criando-uma-logica-para-remover-contatos). O exercício é para listar os contatos da tabela e habilitar um link remover que deveria excluir o contato selecionado no banco de dados. O erro ocorre no arquivo lista.JSP, quando clico em remover, da NullPointerException, fiz uns testes e percebi que na linha <a>href="mvc?logica=RemoveContatoLogic&id=${contatobd.id}">Remover</a> onde há "${contatobd.id}" ele retorna null, porém, os demais campos como ${contatobd.nome} são listados corretamente. Alguém poderia me ajudar? Segue minhas classes.

Arquivo lista.JSP

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Lista Usuários</title>
    </head>
    <body>
        <c:import url="cabecalho.jsp" />


        <jsp:useBean id= "dao" class = "Modelo.Dao.ContatoDao"/>

        <table border="2" align="center">

            <c:forEach var="contatobd" items = "${dao.listaContatos()}">
                <tr>
                    <td> ${contatobd.nome} </td>
                    <td> <c:choose>
                            <c:when test="${not empty contatobd.email}">
                                <a href="mailto:${contatobd.email}">${contatobd.email}</a>
                            </c:when>
                            <c:otherwise>
                                E-mail não informado
                            </c:otherwise>
                        </c:choose>
                    </td>
                    <td> ${contatobd.endereco} </td>
                    <td> <fmt:formatDate value="${contatobd.dataNascimento.time}"
                                    pattern="dd/MM/yyyy" /> </td>
                    <td> ID ${contatobd.id}</td>//Isso está retornado vazio.
                    <td>
                        <a href="mvc?logica=RemoveContatoLogic&
                           id=${contato.id}">Remover</a>
                    </td>
                </tr>
            </c:forEach>

        </table>
        <c:import url="rodape.jsp" />

    </body>
</html>

Classe RemoveContatoLogic

public class RemoveContatoLogic implements Logica {

    @Override
    public String executa(HttpServletRequest req, HttpServletResponse res)
            throws Exception {

        Integer id = Integer.parseInt(req.getParameter("id"));

        ContatoBean contato = new ContatoBean();
        contato.setId(id);

        ContatoDao dao = new ContatoDao();
        dao.exclui(contato);

        System.out.println("Excluindo contato... ");

        return "lista.jsp";
    }

}

Classe ControllerServlet

@WebServlet("/mvc")
public class ControllerServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {

        String parametro = request.getParameter("logica");
        System.out.println(parametro);
        String nomeDaClasse = "Mvc.Logica." + parametro;

        try {
            Class<?> classe = Class.forName(nomeDaClasse);
            System.out.println("O nome é: " + nomeDaClasse);
            Logica logica = (Logica) classe.newInstance();
            String pagina = logica.executa(request, response);

            request.getRequestDispatcher(pagina).forward(request, response);

        } catch (Exception e) {
            throw new ServletException(
                    "A lógica de negócios causou uma exceção", e);
        }
    }
}

Classe ContatoBean

public class ContatoBean {

    private Integer id;
    private String nome;
    private String email;
    private String endereco;
    private Calendar dataNascimento;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getEndereco() {
        return endereco;
    }
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    public Calendar getDataNascimento() {
        return dataNascimento;
    }
    public void setDataNascimento(Calendar dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

}

Classe ContatoDao

public class ContatoDao {

    private final Connection connection;

    public ContatoDao() throws ClassNotFoundException {
        this.connection = new ConnectionFactory().getConnection();
    }

    //Método que lista os contatos
    public List<ContatoBean> listaContatos() throws SQLException {

        PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
        ResultSet rs = stmt.executeQuery();

        List<ContatoBean> contatos = new ArrayList<ContatoBean>();

        while (rs.next()) {

            // criando o objeto Contato
            ContatoBean contato = new ContatoBean();
            contato.setNome(rs.getString("nome"));
            contato.setEmail(rs.getString("email"));
            contato.setEndereco(rs.getString("endereco"));

            // montando a data através do Calendar
            Calendar data = Calendar.getInstance();
            data.setTime(rs.getDate("dataNascimento"));
            contato.setDataNascimento(data);

            // adicionando o objeto à lista
            contatos.add(contato);
        }

        rs.close();
        stmt.close();

        return contatos;
    }


    public void exclui(ContatoBean contato) {

        try {
            PreparedStatement stmt = connection.prepareStatement("delete"
                    + "from contatos where id=?");
            stmt.setLong(1, contato.getId());
            stmt.execute();
            stmt.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}

o erro que acontece é o seguinte:

type Exception report

message A lógica de negócios causou uma exceção

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: A lógica de negócios causou uma exceção
    Mvc.Servlet.ControllerServlet.service(ControllerServlet.java:32)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NumberFormatException: null
    java.lang.Integer.parseInt(Integer.java:542)
    java.lang.Integer.parseInt(Integer.java:615)
    Mvc.Logica.RemoveContatoLogic.executa(RemoveContatoLogic.java:19)
    Mvc.Servlet.ControllerServlet.service(ControllerServlet.java:27)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Obrigado

  • Atualizei minha resposta.

    lucastody   08 de mai de 2014
  • Atualizei minha resposta de novo.

    lucastody   08 de mai de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags null exception tomcat web jsp tags ou faça a sua própria pergunta.