Ir ao conteúdo
  • Cadastre-se

Java Apostila fj21 da caelum. Null Pointer Exception Erro.


Posts recomendados

Olá pessoal, estou revisando a apostila da caelum FJ21 e estou com um problema que não consigo resolver.

Eu tenho uma classse DAO com os metodos para adicionar, alterar, etc.:


 

package br.com.caelum.agenda.dao;

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

import br.com.caelum.agenda.ConnectionFactory;
import br.com.caelum.agenda.modelo.Contato;

public class ContatoDao {
    private Connection connection;

    public ContatoDao() {
        try {
            this.connection = new ConnectionFactory().getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void adiciona(Contato contato) {
        try {
            String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";
            PreparedStatement stmt = connection.prepareStatement(sql);

            stmt.setString(1, contato.getNome());
            stmt.setString(2, contato.getEmail());
            stmt.setString(3, contato.getEndereco());
            stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));

            stmt.execute();
            stmt.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public List<Contato> getLista() {
        try {
            List<Contato> contatos = new ArrayList<Contato>();
            PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");

            ResultSet rs = stmt.executeQuery();

            while(rs.next()) {
                Contato contato = new Contato();
                //popula o objeto contato
                contato.setId(rs.getLong("id"));
                contato.setNome(rs.getString("nome"));
                contato.setEmail(rs.getString("email"));
                contato.setEndereco(rs.getString("endereco"));

                //popula a data de nascimento do contato, fazendo a conversao
                Calendar data = Calendar.getInstance();
                data.setTime(rs.getDate("dataNascimento"));
                contato.setDataNascimento(data);

                //adiciona o contato na lista
                contatos.add(contato);
            }

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

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

    public void exclui(Contato contato) {
        String sql = "delete from contatos where id=?";
        try {
            PreparedStatement stmt = this.connection.prepareStatement(sql);
            stmt.setLong(1, contato.getId());
            stmt.execute();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void atualiza(Contato contato) {
        String sql = "update contatos set id=?, nome = ?, email = ?, endereco = ?, dataNascimento = ? where id = ?";
        try {
            PreparedStatement stmt = this.connection.prepareStatement(sql);
            stmt.setString(1, contato.getNome());
            stmt.setString(2, contato.getEmail());
            stmt.setString(3, contato.getEndereco());
            stmt.setDate(4, new java.sql.Date(contato.getDataNascimento().getTimeInMillis()));
            stmt.setLong(5, contato.getId());

            stmt.execute();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

tenho a classe responsavél pela alteração:


 

package br.com.caelum.mvc.logica;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.agenda.dao.ContatoDao;
import br.com.caelum.agenda.modelo.Contato;

public class AlterarContatoLinkLogica implements Logica{
    
    @Override
        public void executa(HttpServletRequest request, HttpServletResponse response) throws Exception{
            Contato contato = new Contato();
            Calendar dataNascimento =null;
            long id = Long.parseLong(request.getParameter("id"));
            contato.setId(id);
            contato.setNome(request.getParameter("nome"));
            contato.setEndereco(request.getParameter("endereco"));
            contato.setEmail(request.getParameter("email"));

            String dataEmTexto = request.getParameter("dataNascimento");
            Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
            dataNascimento = Calendar.getInstance();
            dataNascimento.setTime(date);

            contato.setDataNascimento(dataNascimento);
            ContatoDao dao = new ContatoDao();
            dao.atualiza(contato);
            RequestDispatcher rd = request.getRequestDispatcher("/altera-contato-mvc.jsp");
            rd.forward(request, response);
            System.out.println("Manda para um pagina diferente ... "+contato.getNome());
             
        }
    protected void doPost(HttpServletRequest request, HttpServletRequest response) throws ServletException,IOException{
        
    }
    }

A página  jsp que deverá ser aberta:
 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="caelum" %>

<c:import url="cabecalho.jsp"/>
Formulário para alteração de contatos:<br/>
<form action="mvc" method="POST">
    Id:
    <input type="text" name="id" value="${param.id}" readonly/><br/>
    Nome:
    <input type="text" name="nome" value="${param.nome}"/><br/>
    E-mail:
    <input type="text" name="email" value="${param.email}"/><br/>
    Endereço: <input type="text" name="endereco" value="${param.endereco}"/><br/>
    <fmt:formatDate value="${param.dataNascimento.time}" pattern="dd/MM/yyyy" var="dataFormatada"></fmt:formatDate>
    Data de Nascimento: <input type="text" name="dataNascimento" value="${dataFormatada}" />
    <input type="hidden" name="logica" value="AlterarContatoLinkLogic"/>
    <input type="submit" value="Enviar"/>
</form>
<c:import url="rodape.jsp" />

E uma controladora:


 

package br.com.caelum.mvc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.mvc.logica.Logica;

@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="br.com.caelum.mvc.logica." + parametro;
        
        try {
            Class classe = Class.forName(nomeDaClasse);
            Logica logica = (Logica) classe.newInstance();
            logica.executa(request, response);
            
        }catch(Exception e) {
            throw new ServletException("A lógica de negocios causou uma exceção",e);
        }
        
    }
}

Quando clico no icone de alteração a página de alteração não abre e é gerado o erro:

 

jun 05, 2018 4:26:09 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.caelum.mvc.servlet.ControllerServlet] in context with path [/fj21-agenda] threw exception [A lógica de negocios causou uma exceção] with root cause
java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1439)
    at java.text.DateFormat.parse(DateFormat.java:364)
    at br.com.caelum.mvc.logica.AlterarContatoLinkLogica.executa(AlterarContatoLinkLogica.java:29)
    at br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:25)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...