Unpasable Date em Simple Date Format[RESOLVIDO]

estou tentando passar data que recebo em string do meu JFormatedText em java.sql.Date para persistir no banco de dados… como quero realmente dominar o core do java, antes de partir para frameworks. estou tendo problemas com o parse… criei um metodo no meu model Cliente, para fazer o parse, mas recebo a seguinte stack trace.

Conectando ao Banco
java.text.ParseException: Unparseable date: “24/07/1993”
at java.text.DateFormat.parse(DateFormat.java:337)
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at com.model.Cliente.parseData(Cliente.java:70)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

á seguir o codigo com o metodo


package com.model;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Cliente {
	
	private String nome;
	private int sexo;
	private String telefone;
	private String rg;
	private String cpf;
	private String dataNascimento;

	public Cliente(String nome, int sexo, String telefone, String rg, String cpf, String dataNascimento) {
		this.nome = nome;
		this.sexo = sexo;
		this.telefone = telefone;
		this.rg = rg;
		this.cpf = cpf;
		this.dataNascimento = dataNascimento;
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getSexo() {
		return sexo;
	}
	public void setSexo(int sexo) {
		this.sexo = sexo;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
	
	public Date parseData(String data){
		SimpleDateFormat formataData = new SimpleDateFormat("yyyy-MM-dd");
		Date novaData = null;
			try {
				novaData = (Date) formataData.parse(data);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		return new Date(novaData.getTime());
		
	}
	
}

A máscara que você ta tentando parsear não é a mesma q ta vindo (pelo que vi no erro)

deveria ser:
SimpleDateFormat formataData = new SimpleDateFormat(“dd/MM/yyyy”);

Abcs

O formato que está sendo passado é diferente do pattern especificado no SimpleDateFormat. Se vai passar a data “24/07/1993”, o pattern deve ser “dd/MM/yyyy” ao invés de “yyyy-MM-dd”.

SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");

hum… nao havia me atentado ha isso… agora porem… estou recebendo esta stacktrace, acho que o problema esta no meu DAO… sou iniciante em desktop entao. devem haver alguns erros.

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:28)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


package com.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.jdbc.ConnectionFactory;
import com.model.Cliente;

public class ClienteDAO {
	private Connection connection;

	public ClienteDAO() {
		this.connection = new ConnectionFactory().getConnetion();
	}

	public void adiciona(Cliente cliente) {
		String sql = "insert into clientes(nome, sexo, telefone, rg, cpf, dataNascimento) values(?,?,?,?,?,?)";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, cliente.getNome());
			stmt.setLong(2, cliente.getSexo());
			stmt.setString(3, cliente.getTelefone());
			stmt.setString(4, cliente.getRg());
			stmt.setString(5, cliente.getCpf());
			stmt.setString(6, cliente.getCpf());
			stmt.setDate(6, cliente.parseData(cliente.getDataNascimento()));
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();

		}
	}
	public void lista(){
		
	}
}

É que co JDBC a data tu seta como java.sql.Date e nao java.util.Date

basta

stmt.setDate(6, new java.sql.Date(cliente.parseData(cliente.getDataNascimento()).getTime()));

Abcs

Rogério N Jr.

ah… a stacktrace agora é essa… acho que o problema é que o metodo parse da simpledateformat retorna um java.util.date e nao um java.sql.date. ainda nao achei solução. nem o cast funcionou…

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at com.model.Cliente.parseData(Cliente.java:66)
at com.dao.ClienteDAO.adiciona(ClienteDAO.java:29)
at com.gui.MontaUI$1.actionPerformed(MontaUI.java:107)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Resposta coloquei no post anterior

Abcs

eu ja implementei o que você me passou na resposta anterior, agora recebo a stacktrace acima…

O problema não está no DAO e sim no Cliente. Na classe Cliente você está importando java.sql.Date, portanto se não especificar o caminho do Date, será usado o do pacote java.sql. Se olhar o stack trace verá que a exceção é lançada no método parseData na linha 66:

at com.model.Cliente.parseData(Cliente.java:66)O problema com o cast está aqui:

novaData = (Date) formataData.parse(data); // novaData é um java.sql.Date e o parse retorna um java.util.Date

Porque não armazena a data como Calendar? Quando for passar para o DAO, faz o procedimento sugerido pelo Rogerio, convertendo pra java.sql.Date.

sim. essa era minha ideia inicial. mas mudei por que nao consegui passar. pegar do JFormatedText pra popular o cliente. nao achei um metodo para calendar.


	
	private void montaBotaoAdicionar() {
		JButton botaoCarregar = new JButton("Adicionar");
		botaoCarregar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new ClienteDAO().adiciona(new Cliente(nome.getText(), sexo.getSelectedIndex(), telefone.getText(), rg.getText(), cpf.getText(), dataNascimento.getText());
			}
		});
		principal.add(botaoCarregar);
	}
	

pronto… ja esta quase tudo resolvido. so nao estou conseguindo pegar o valor da data de nascimento quando populo o cliente, pegando os valores jformatedtextfield que contem o calendario…

Não entendi. O que está dando errado?


  private void montaBotaoAdicionar() {  
      JButton botaoCarregar = new JButton("Adicionar");  
      botaoCarregar.addActionListener(new ActionListener() {  
          public void actionPerformed(ActionEvent e) {  
              new ClienteDAO().adiciona(new Cliente(nome.getText(), sexo.getSelectedIndex(), telefone.getText(), rg.getText(), cpf.getText(), dataNascimento.getText());  
          }  
      });  
      principal.add(botaoCarregar);  
  }  

aonde eu pego o getText(); da dataNascimento. ele nao aceita. nao to conseguindo pegar o valor dele por ser date, ja testei com o getValue() e tambem nao funcionou.

Você mudou a dataNascimento para Calendar? Se for isso tem que passar como Calendar e não como String.

Você pode usar o método de parse que postou no primeiro post. Eu só tinha dito que não é responsabilidade do cliente fazer o parse da data, que deve ser feito antes de passar a data para o cliente.

sim, mas na hora de popular, o getText(); nao funciona, por que dataNascimento é Calendar, eu estou implementando outro parse aqui, mas nao estou sabendo como chamalo.

Não muda muita coisa não, ficaria mais ou menos assim:

[code] public Calendar parseData(String data){
DateFormat formataData = new SimpleDateFormat(“dd/MM/yyyy”);
Calendar novaData = Calendar.getInstance();
try {
novaData.setTime(formataData.parse(data));
} catch (ParseException e) {
JOptionPane.showMessageDialog(this, “Formato de data inválido”);
}
return novaData;

}[/code][code]  private void montaBotaoAdicionar() {  
  JButton botaoCarregar = new JButton("Adicionar");  
  botaoCarregar.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) {  
          new ClienteDAO().adiciona(new Cliente(nome.getText(), sexo.getSelectedIndex(), telefone.getText(), rg.getText(), cpf.getText(), parseData(dataNascimento.getText()));  
      }  
  });  
  principal.add(botaoCarregar);  

}[/code]

Obrigado Eric Yuzo. agora deu certo… não sabia que swing dava tanto trabalho. acho que existem frameworks que facilitam bem o trabalho, mas acho que é melhor começar na unha mesmo… como vou desenvolver o sistema completo mesmo. provavelmente terei mais diversas duvidas… vlw.