Erro 500 Servlet java

Estou fazendo o curso Java para Desenvolvimento Web - Curso FJ-21.
fiz o exercício das pag. 67,68.
quando vou cadastrar o contado ele da erro 500.

HTTP Status 500 -

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(Unknown Source)
java.text.DateFormat.parse(Unknown Source)
br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.70 logs.

Apache Tomcat/7.0.70

Código:

package br.com.caelum.servlet;

import java.util.Calendar;

public class Contato {

	private long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;
	public long getId() {
		return id;
	}
	public void setId(long 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;
	}
	public void setDataNascimento(String string) {
		// TODO Auto-generated method stub
		
	}
	
}



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

public class ContatoDao {

	// a conexão com o banco de dados
	private Connection connection;
	
	@SuppressWarnings("static-access")
	public ContatoDao() {
		this.connection = new ConnectionFactory().getConnection();
				
	}
	
public void  adiciona(Contato contato) {
	String sql = "insert into contatos"+
                 " (nome,email,endereco,datanascimento)"+
			     " 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.getDataNascimento().getTimeInMillis()));
		
		//executa
		
		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();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
			
		// montando a data atraves de calenadar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanascimento"));
			contato.setDataNascimento(data);
			
	    // adinionamento o objeto a lista
			contatos.add(contato);
			
		}
		rs.close();
		stmt.close();
		return contatos;
		
	 }catch (SQLException e){
		 throw new RuntimeException(e);
	 }
	 }
   public void altera(Contato Contato){
       String sql = "update contatos set nome=?, email=?,endereco=?,datanascimento=? where id=?";
      
      try{
		   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.setLong(5, Contato.getId());
		   stmt.execute();
		   stmt.close();
		   
	   }catch (SQLException e){
		   throw new RuntimeException(e);
		   
	   } 
   }
   
 public void remove(Contato 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);		 
	 }
 }
}



package br.com.caelum.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	Connection con;
	public static Connection  getConnection(){
		Connection con=null;
    	   try {
    		   con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/fj21","postgres","sistemas");
    		   System.out.println("Conexão efetuada com sucesso!!!");
    	   }catch (SQLException e) {
    		   System.out.println("Não foi possível Conectar!! " +e.getMessage());;
    	   }
           return con; 
       }
      
     
	}	




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.com.caelum.dao.ContatoDao;

@SuppressWarnings("serial")
@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet{
    protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    	//busca o write
    	PrintWriter out = response.getWriter();
    	
    	//busca os parametros norequest
    	String nome = request.getParameter("nome");
    	String endereco = request.getParameter("endereco");
    	String email = request.getParameter("email");
    	String dataEmTexto = request.getParameter("datanascimento");
    	Calendar dataNascimento = null;
    	
    	// fazendo a conversão da data
    	try {
    		
    		Date date = new SimpleDateFormat("mm/dd/yyyy").parse(dataEmTexto);
    		dataNascimento = Calendar.getInstance();
    		dataNascimento.setTime(date);
    		
    		
    	}catch (ParseException e){
    		out.println("Erro de corversão da data!!");
    		return; // para a execusão do método.
    	}
    	// monta um objeto contato
    	Contato contato = new Contato();
    	contato.setNome(nome);
		contato.setEndereco(endereco);
    	contato.setEmail(email);
    	contato.setDataNascimento(dataNascimento);
    	
    	// salva 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>");
    	
    	
    }
}

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
  <h1>Adiciona Contatos</h1>
  <hr />
  <form action="adicionaContato">
    Nome: <input type="text" name="nome" /><br />
    E-mail: <input type="text" name="email" /><br />
    Endereço: <input type="text" name="endereco" /><br />
    Data Nascimento: <input type="text" name="dataNascimento" /><br />
    <input type="submit" value="Gravar"/>
  </form> 
</body>
</html>

O problema aparentemente está na linha a baixo.

O seu “dataEmTexto” não deve estar vindo preenchido.

String dataEmTexto = request.getParameter("datanascimento");

o parametro que vem pela requisiçaõ é datanascimento mesmo?
`

isso provavelmente acontece pq vc acredita que todos os parametros do request vem direitinho.

com o tempo vc adquire uma boa dose de paranoia e passa a verificar e lançar exception quando falta um campo obrigatorio. e ai o seu client-side vai validar tb com javascript pra dar uma mensagem bonitinha pro usuario

Muito obrigado, esta situação resolvi.
Eu inseri o parametro no html dataNascimento e Servlet estava como datanascimento.
Atenciosamente
Anderson Cardozo de Souza

Boa noite, muito obrigado por responder.
Eu estou começando agora a programar em java.
Não tenho nenhuma experiência.
Mais quero muito aprender.
Atenciosamente
Anderson Cardozo de Souza

Boa noite Douglas.

Agora esta dando este outro erro no ContatoDao.
Boa tarde a todos que me responderam.
Como estão vendo eu estou começando a estudar o Java agora. Não tenho experiência nenhuma.
a dataNascimento esta errada.

Isso agora resolveu.
Porém agora deu outro erro no br.com.caelum.dao.ContatoDao.adiciona(ContatoDao.java:33).

HTTP Status 500 -

type Exception report

message

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

exception

java.lang.NullPointerException
br.com.caelum.dao.ContatoDao.adiciona(ContatoDao.java:33)
br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:53)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.70 logs.

Apache Tomcat/7.0.70

É porque não esta passando o Parametro dentro get.Nome exemplo.

public void adiciona(Contato contato) {
String sql = “insert into contatos”+
" (nome,email,endereco,datanascimento)"+
" values (?,?,?,?)";
try {
//prepared statement para inserção
PreparedStatement stmt = connection.prepareStatement(sql);

	//seta os valores
	stmt.setString(1, contato.getNome("nome")); // exemplo dentro do getNome tenho que informar alguma coisa
	stmt.setString(2, contato.getEmail());
	stmt.setString(3, contato.getEndereco());
	stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
	
	//executa
	
	stmt.execute();
	stmt.close();
} catch (SQLException e) {
	throw new RuntimeException(e);
}

}

Desde já agradeço muito
Atenciosamente
Anderson Cardozo de Souza

Ola @souzacardozo

stmt.setString(1, contato.getNome(“nome”));

Nessa linha e nas outras ela não recebe nenhum valor.

Aqui ele so recupera o valor ja passado em outro momento na apostila.

O certo é assim :

stmt.setString(1, contato.getNome());

{ },s

O que o Daniel disse faz sentido.
Mas tem alguma outra coisa estranha, por que se seu getNome ainda está igual ao que vc colocou no primeiro post era para dar um erro de compilação.

public String getNome() { return nome; }

Não existe nenhum getNome que recebe uma String. Você alterou ele?