Erro em PreparedStatement.setDate

Peço ajuda com este erro

package br.com.caelum.jdbc.modelo;

import br.com.caelum.jdbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import java.util.Calendar;


public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao(){
		this.connection =  new ConnectionFactory().getConnection();
		
	}//fim public CaontatoDao()
	
	public void insere(Contato contato){
		String sql = "insert into contatos (nome, email, endereco, dataNascimento)"+
		             "values (?, ?, ?, ?)";
		
		try{
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, (java.sql.Date) new Date(contato.getDataNascimento().getTimeInMillis()));
			
			stmt.execute();
			stmt.close();
			
		}//fim try
		catch (SQLException e){
			throw new RuntimeException(e);
			
		}//fim catch (SQLException e)
			
	}//fim public void insere(Contato contato)

}//fim public class ContatoDao

Conectando ao banco!!
Exception in thread “main” java.lang.NullPointerException
at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:30)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)

Também tentei sei o cast.
Desde já agradeço sua atenção.

Assim cara, você precisa aprender a ler os erros que ocorrem. Repare que trata-se de uma NullPointerException. Na maioria das vezes esse erro ocorre porque você invoca um método (ou acessa um membro de classe) a partir de uma referência nula. O mais provável é que a referência retornada pelo método getDataNascimento seja nula.

fiz de outra forma e recebi este erro

package br.com.caelum.jdbc.modelo;

import br.com.caelum.jdbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;


public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao(){
		this.connection =  new ConnectionFactory().getConnection();
		
	}//fim public CaontatoDao()
	
	public void insere(Contato contato){
		String sql = "insert into contatos (nome, email, endereco, dataNascimento)"+
		             "values (?, ?, ?, ?)";
		
		try{
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			
			SimpleDateFormat in = new SimpleDateFormat("YYYY-MM-DD");
			SimpleDateFormat out = new SimpleDateFormat("DD-MM-YYYY");
			 
			
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			stmt.execute();
			stmt.close();
			
		}//fim try
		catch (SQLException e){
			throw new RuntimeException(e);
			
		}//fim catch (SQLException e)
			
	}//fim public void insere(Contato contato)

}//fim public class ContatoDao

Conectando ao banco!!
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments (int, Date)

at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:36)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)

Crie um main() no seu código de forma que possamos apenas executar e ver o erro ocorrendo.

Cara,
como o erro diz, o setDate não possui argumentos válidos para os tipos que você informou.
Ou seja, o método setDate do PreparedStatement possui como segundo argumento uma instância do objeto java.sql.Date
e você informou uma do tipo java.util.Date.

Espero ter ajudado!

Valeu!

aqui está o main e a classe Contato


package br.com.caelum.jdbc.modelo;

import java.util.Calendar;

public class TestaInsere {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Contato contato = new Contato();
		contato.setNome("Nicolly");
		contato.setId(10);
		contato.setEndereco("Rua Nova Conquista, 3591");
		contato.setEmail("nicolly@hotmail.com");
		contato.setDataNascimento(Calendar.getInstance());
		
		ContatoDao dao = new ContatoDao();
		
		dao.insere(contato);
		
		System.out.println("Gravado");

	}

}


package br.com.caelum.jdbc.modelo;

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;
	}//fim setDataNascimento
	

	
}//fim public class Contatos

e este é o erro
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments (int, Date)

    at br.com.caelum.jdbc.modelo.ContatoDao.insere(ContatoDao.java:36)
at br.com.caelum.jdbc.modelo.TestaInsere.main(TestaInsere.java:19)

Qual seria o argumento correto para PreparedStatement.setDate? Estou usando apostilas da Caelum então não entendo esse erro.

Como o colega acima falou, você está passando um objeto da classe java.util.Date, sendo que o método espera um objeto da classe java.sql.Date. Você tem duas opções, ou importa a classe java.sql.Date ou então usa o nome completo da classe:

new java.sql.Date( ... )

OK. Deu certo quando fiz a importação