Erro nullPointerException na conversão de datas

Galera, to seguindo a apostila FJ21 da Caelum e em dado momento a apostila diz para converter uma data, porém a formatação dá erro nullPointerException… só que ela acusa uma linha que esta dentro do try/catch, e ao inves de lançar a exceção que eu criei no catch lança o null… Sou ainda iniciante e nunca passei por nada parecido e não faço ideia do que possa ser. Embora compreenda que nullPointer indica um apontamento para uma variavel nula, esse codigo esta exatamente IGUAL ao da apostila, e a linha em questao esta tratada. Existe alguma coisa que estou deixando passar, se puderem me ajudar seria eternamente grato!

Segue o codigo do erro

type Exception report

message

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

exception

java.lang.NullPointerException
java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1439)
java.text.DateFormat.parse(DateFormat.java:364)
br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:44)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Segue classe que contem a linha identificada como erro [nota que a IDE diz que o arquivo nao possui erros]

`package br.com.caelum.servlet;`

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
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.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.dao.ContatoDAO;`

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet {
/**
 * 
 */
private static final long serialVersionUID = 1L;`

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

	PrintWriter out = response.getWriter();

	// pegando os parâmetros do Request
	String nome = request.getParameter("nome");
	String endereco = request.getParameter("endereco");
	String email = request.getParameter("email");
	String dataTexto = request.getParameter("dataNas");
	Calendar dataNas = null;

	// fazendo a conversão da data
	

	try {
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataTexto); //Esta é a linha 44 onde o compilador diz que o erro está acontecendo
		dataNas = Calendar.getInstance();
		dataNas.setTime(date);
	} catch (ParseException e) {
		out.println("Erro	de	conversão	da	data");
		return; // para a execução do método
	}

	// monta um objeto contato
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEndereco(endereco);
	contato.setEmail(email);
	contato.setDataNas(dataNas);

	// salva o contato
	ContatoDAO dao = new ContatoDAO();
	dao.adiciona(contato);

	// imprime o nome do contato que foi adicionado
	out.println("<html>");
	out.println("<body>");
	out.println("<Contato>" + contato.getNome() + "adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");
}

}

O parâmetro dataNas está sendo enviado ? Aparentemente é isso que está acontecendo. Debugue o código e veja se está vindo valor do request.

Para capturar o nullpointer no seu catch você deve adiciona-lo:

} catch (ParseException e) {
	out.println("Erro	de	conversão	da	data");
	return; // para a execução do método
}catch(NullPointerException en) {
	out.println("Null");
}

Olá, para dar nullPointer nesta linha sua variável dataTexto deve estar nula, verifique se de fato está setando um valor nela, se o parametro não vem nulo.
Obs.: verificar quer dizer comprovar em debug, não olhar o código. :wink:

Cara, a pagina html nem chega a carregar, quando eu dou “run on server” o html carrega com o erro que eu printei aqui.

Sobre debugar e o valor estar nulo, eu nao sei fazer isso muito bem, mas de qualquer forma o codigo esta absolutamente igual ao jeito que esta na apostila.

Em todo caso, como faço pra debugar do jeito que vc falou?

Cara, vou tentar fazer isso. Não sei bem como. De qqr forma o codigo esta igual ao da apostila, vou colocar aqui

segue

2 formas: o debug correto é rodar ele em modo de depuração, tem um botão geralmente do lado do play.
Ou simplesmente printa no console a variável.

Não quer dizer que estando igual deve rodar igual, tem muita coisa que pode ser diferente, como isto é um método de requisição, o problema é que a request não está mandando o valor, logo, não faz diferença se o código tá igual.

bom, igual, igual não está, vc alterou o nome dos parametros.
99% de certeza que vc n está recebendo o valor do parametro, confira oq está mandando e oq está recebendo.

Cara, eu mudei agora justamente pra ter certeza de que não estava cometendo um erro do tipo “dataNacsimento” ou algo assim, então troquei por algo que ficasse mais facil de identificar em uma primeira vista. Mas antes disso tambem tentei com os parâmetros iguais.

Vou tentar debugar aqui e ver o que acontece.

Po brigado pela força gurizada, vcs tão ajudando muito!

Ja respondo o que rolou

O seu código estava dentro de uma página JSP ?
Então pode ser que não esteja carregando a página porque não tem o parâmetro dataNascimento.

Adicione o catch que falei para poder carregar a página, ou então verifique antes de fazer a conversão:

if(request.getParameter("dataNas") != null){
    // seu código aqui....................
}

Aqui com o catch que vc falou. Agora pelo menos nao deu mais o erro que dava antes. Agora aparece so isso

To trabalhando em cima, tentando fazer o debug.

Não pode ser um problema na classe que faz o request?

cara, coloquei o catch que tu falou e o erro mudou, agora eh esse aqui que aparece

java.lang.NullPointerException
at br.com.caelum.jdbc.dao.ContatoDAO.adiciona(ContatoDAO.java:35)
at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:63)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1156)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
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)

Repara que agora ele falou que o problema ta no contatoDAO e na outra classe.

Aqui segue o codigo do ContatoDAO

package br.com.caelum.jdbc.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.caelum.jdbc.ConnectionFactory;
import br.caelum.jdbc.modelo.Contato;

public class ContatoDAO {

private Connection connection;

public ContatoDAO() {
	this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Contato contato) {
	String sql = "insert into contatos" + "(nome, email, endereco, dataNas)" + "values(?,?,?,?)";

	try {

		// Prepared Statement para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);

		// Seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNas().getTimeInMillis())); //Essa é a linha 36 onde o compilador acusa o erro

		// Executa e fecha
		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()) {
			// Criando o objeto contato
			Contato contato = new Contato();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

			// montando a tela atraves do calendar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNas(data);

			// adicionando objetos a lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}

Provavelmente aqui.
Se vc fez o if pra ignorar a data caso ela não venha, a var continuou nula, e agora estoura ali. Empurrou o problema com a barriga. Vc precisa resolver seu problema da request antes.

Cara, não fiz if, só segui o jeito que tava na apostila.

Olha só, eu tratei todas as linhas que o compilador acusava como erro e olha o que o navegador apresenta agora.

Agora virou uma anarquia de vez

Vc n disse q fez aquilo que o Renan postou acima?
Posta o código novamente.

Aqui contatodao

package br.com.caelum.jdbc.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.caelum.jdbc.ConnectionFactory;
import br.caelum.jdbc.modelo.Contato;

public class ContatoDAO {

private Connection connection;

public ContatoDAO() {
	this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Contato contato) {
	String sql = "insert into contatos" + "(nome, email, endereco, dataNas)" + "values(?,?,?,?)";

	try {

		// Prepared Statement para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);

		// Seta os valores
		
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNas().getTimeInMillis()));
		
		// Executa e fecha
		stmt.execute();
		stmt.close();

	} catch (SQLException e) {
		System.out.println("Erro" + e);
	} catch (NullPointerException en) {
		System.out.println("Erro NullPointer" + en);
	}

}

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()) {
			// Criando o objeto contato
			Contato contato = new Contato();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));

			// montando a tela atraves do calendar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNas"));
			contato.setDataNas(data);

			// adicionando objetos a lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}

Aqui o AdicionaServlet

package br.com.caelum.servlet;

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

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.caelum.jdbc.modelo.Contato;
import br.com.caelum.jdbc.dao.ContatoDAO;

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;

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

	PrintWriter out = response.getWriter();

	// pegando os parâmetros do Request
	String nome = request.getParameter("nome");
	String endereco = request.getParameter("endereco");
	String email = request.getParameter("email");
	String dataTexto = request.getParameter("dataNas");
	Calendar dataNas = null;

	// fazendo a conversão da data
	

	try {
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataTexto);
		dataNas = Calendar.getInstance();
		dataNas.setTime(date);
	} catch (ParseException e) {
		out.println("Erro	de	conversão	da	data");
		return; // para a execução do método
	} catch(NullPointerException en) {
		out.println("Null" + en);
	}

	// monta um objeto contato
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEndereco(endereco);
	contato.setEmail(email);
	contato.setDataNas(dataNas);

	// salva o contato
	ContatoDAO dao = new ContatoDAO();
	dao.adiciona(contato);

	// imprime o nome do contato que foi adicionado
	out.println("<html>");
	out.println("<body>");
	out.println("<Contato>" + contato.getNome() + "adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");
}

}