Problema não identificado

6 respostas
D

Galera, to cum problema e num to conseguindo detectar onde que ele se encontra. Vou coloca os códigos e o erro:

ERRO: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sistemaproduto.modelo.dominio.constante.UnidadeVenda cannot be cast to java.lang.String
at sistemaproduto.interfacegrafica.TelaDadosProduto.getProduto(TelaDadosProduto.java:37)
at sistemaproduto.interfacegrafica.OuvinteDeTelaDadosProduto$OuvinteGravarProduto.actionPerformed(OuvinteDeTelaDadosProduto.java:24)
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:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
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:4574)
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)

CÓDIGO

//...
       public Produto getProduto() throws ClasseDeExcecao {
       String nome = tfNome.getText();
        if (nome == null || nome.trim().equals("")) {
            tfNome.requestFocus();
            throw new ClasseDeExcecao("Não foi informado o nome do produto.");
        } else {
            produto.setNome(nome);
        }
       
        produto.setQuantidade(Integer.parseInt(this.tfQuantidade.getText()));

       String unidadeVenda = (String) cbUnidadeVenda.getSelectedItem();
        if (unidadeVenda.trim().equals("")) {
            throw new ClasseDeExcecao("Não foi informada a unidade de venda do produto.");
        } else {
            produto.setUnidadeVenda(unidadeVenda);
        }
...
Classe VO
//...
private String UnidadeVenda;

    public String getUnidadeVenda() {
        return UnidadeVenda;
    }

    public void setUnidadeVenda(String UnidadeVenda) throws ClasseDeExcecao {
        if(UnidadeVenda==null || UnidadeVenda.length()==0){
            throw new ClasseDeExcecao("Unidade de venda não informada");
        }
        this.UnidadeVenda = UnidadeVenda;
    }
//...
Select
//...
 private static final String SQL_INCLUIR =
            "INSERT INTO produto (codigoproduto, nome, quantidade, unidadeVenda, valorUnitario, valorTotal, dataCompra) "
            + "VALUES (?, ?, ?, ?, ?, ?, ?)";
    private static final String SQL_ALTERAR =
            "UPDATE produto SET nome = ?, quantidade = ?, unidadeVenda = ?, valorUnitario = ?, valorTotal = ?, dataCompra = ? WHERE codigoproduto = ?";

//...
criar, insere, altera e grava
//...
private Produto criarProduto(ResultSet rs) throws ClasseDeExcecao {
        Produto produto = new Produto();
        try {
            produto.setCodigo(rs.getLong("codigoproduto"));
            produto.setNome(rs.getString("nome"));
            produto.setQuantidade(rs.getInt("quantidade"));
            produto.setUnidadeVenda(rs.getString("unidadeVenda"));
            produto.setValorUnitario(rs.getDouble("valorUnitario"));
            produto.setValorTotal(rs.getDouble("valorTotal"));
            produto.setDataCompra(rs.getDate("dataCompra"));
        } catch (SQLException exc) {
            StringBuffer mensagem = new StringBuffer("Não foi possível obter os dados do produto."
                    + " Por favor, entre em contato com o administrador do sistema.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new ClasseDeExcecao(mensagem.toString());
        }
        return produto;
    }

    private void incluirProduto(Produto produto) throws ClasseDeExcecao, SQLException {
        if (produto == null) {
            String mensagem = "Não foi informado o produto a ser cadastrado.";
            throw new ClasseDeExcecao(mensagem);
        }
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = GerenciadorDeConexao.getConexao();
            stmt = (PreparedStatement) con.prepareStatement(SQL_INCLUIR);
            GeradorDeChave geradorDeChave = new GeradorDeChave("produto");
            long codigoproduto = geradorDeChave.getProximoCodigo();
            stmt.setLong(1, codigoproduto);
            stmt.setString(2, produto.getNome());
            stmt.setInt(3, produto.getQuantidade());
            stmt.setString(4, produto.getUnidadeVenda());
            stmt.setDouble(5, produto.getValorUnitario());
            stmt.setDouble(6, produto.getValorTotal());
            java.util.Date datacompra = produto.getDataCompra();
            stmt.setDate(7, new java.sql.Date(datacompra.getTime()));
            stmt.executeUpdate();
        } catch (SQLException exc) {
            StringBuffer msg = new StringBuffer("Não foi possível incluir o produto. "
                    + "Por favor, tente novamente.\n\n\n Se o erro persistir, contate"
                    + " o administrador do sistema.");
            msg.append("\nMotivo do erro: ").append(exc.getMessage());
            throw new ClasseDeExcecao(msg.toString());
        } finally {
            GerenciadorDeConexao.closeConexao(con, stmt);
        }
    }

    private void alterarProduto(Produto produto) throws ClasseDeExcecao {
        if (produto == null) {
            String mensagem = "Não foi informado o produto a ser alterado.";
            throw new ClasseDeExcecao(mensagem);
        }
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = GerenciadorDeConexao.getConexao();
            stmt = (PreparedStatement) con.prepareStatement(SQL_ALTERAR);
            stmt.setString(1, produto.getNome());
            stmt.setInt(2, produto.getQuantidade());
            stmt.setString(4, produto.getUnidadeVenda());
            stmt.setDouble(5, produto.getValorUnitario());
            stmt.setDouble(6, produto.getValorTotal());
            java.util.Date datacompra = produto.getDataCompra();
            stmt.setDate(7, new java.sql.Date(datacompra.getTime()));
            stmt.setLong(8, produto.getCodigo());
            stmt.executeUpdate();
        } catch (SQLException exc) {
            StringBuffer msg = new StringBuffer("Não foi possível atualizar os dados do produto. "
                    + "Por favor, tente novamente.\n\n\n Se o erro persistir, contate o administrador do sistema.");
            msg.append("\nMotivo do erro: ").append(exc.getMessage());
            throw new ClasseDeExcecao(msg.toString());
        } finally {
            GerenciadorDeConexao.closeConexao(con, stmt);
        }
    }

    public void gravarProduto(Produto produto) throws ClasseDeExcecao {
        if (produto.getCodigo() == ConstanteProduto.NOVO) {
            try {
                incluirProduto(produto);
            } catch (SQLException ex) {
                Logger.getLogger(GatewayProduto.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            alterarProduto(produto);
        }
    }

6 Respostas

Jesuino_Master

Ae,
Note o erro:

ERRO: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sistemaproduto.modelo.dominio.constante.UnidadeVenda cannot be cast to java.lang.String

Você tentar jogar uma variável do tipo da sua classe de domínio para uma String, mas jogar, não converter o conteúdo.

Para converter você pode: - usar o
String.valueOf(Object seuObjeto)
,metódo estático... - Chamar o método toString do seu objeto (mas deverá sobreescrever esse método na classe de domínio, pesquise mais sobre ele e tals... - [Feio] tentar concatenar o seu objeto com uma String, por exemplo:
String s = objeto + "";
[/Feio];

Acredito que o erro seu deve estar acontecendo nessa linha:

String unidadeVenda = (String) cbUnidadeVenda.getSelectedItem();

Fiz um pequeno laboratório para mostrar o que escrevi ai em cima:

public class Test{
	public static void main(String args[]){
		Cl1 cl = new Cl1();
		//ClassCastException ou Incovertible types em tempo de compilação!
		//String s1 = (String) cl;
		
		//funciona \o/
		String s2 = String.valueOf(cl);
		
		//funciona, mas lança NullPointerException se cl for nulo (em tempo de execução)! 
		String s3 = cl.toString();
		
		//FEIO!
		String s4 = cl +  "";
		System.out.println(s2);System.out.println(s3);System.out.println(s4);
	}
	
	public static class Cl1{
		public String toString(){
			//O famoso toString: você pode retornar parâmetros aqui ou qq coisa que quiser ^^
			return "Hey!!!11!!11";
		}
		
	}
}
D

Cara, o que você falou funcionou. Porém, agora eu fiquei com uma pulga atrás da orelha, pois usei esse tipo de cast (exemplo: String variavel = (String) cbCategoriaCliente.getSelectItem():wink: em outro JComboBox que tenho e não deu esse problema. Segue o código:

public Cliente getcliente() throws ClasseDeExcecao { String categoria = (String) cbCategoria.getSelectedItem(); if (categoria.trim().equals("")) { throw new ClasseDeExcecao("Não foi informada a categoria do cliente."); } else { cliente.setCategoria(categoria); }

Alguém poderia me dizer porque um funcinou e o outro não?

AH, só para ficar mais claro, eu estou alimentandos os JComboBox com enum.
Segue as enum’s:

public enum CategoriaDeCliente { Vendedora, Administrador }

public enum UnidadeVenda { Caixa, Pacote, Unidade }

Jesuino_Master

A grande pergunta é como você alimentou as Combo Box.

O getSelectedItem retorna a referência do objeto que você coloca lá, ele não mexe no seu objeto.

Você não deve ter preenchido com Enum, pois Enum dá o erro de tipos incompatíveis:

public class EnumString{
    public static void main(String main[]){
        Numeros a = Numeros.um;
        //Tipos incompatíveis
	String s = (String) a;
    }
    public static enum Numeros{
        um, dois, tres;
    }
}

Posta como você preenche as JComboBox!

D

Jesuino Master, fiz dessa forma:

usei as enum’s, dai no construtor da minha classe (onde se encontra os JComboBox) eu coloquei um for para pegar os valores das enum’s. Segue o código abaixo:

//UNIDADE DE VENDA

for (UnidadeVenda unidadeVenda: UnidadeVenda.values()){ cbUnidadeVenda.addItem(unidadeVenda.name()); }

//CATEGORIA DO CLIENTE

for(CategoriaDeCliente categoria: CategoriaDeCliente.values()) { cbCategoria.addItem(categoria.name()); }

No combo categoriaCliente não deu nenhum problema do cast que eu fiz, agora no de unidadeVenda deu aquele erro mencionado na primeira postagem.

Jesuino_Master

Realmente está estranho, pois você está adicionando o valor String do Enum e não o Enum em sí.

D

deixa pra lá, eu usei o String.valueof(cbUnidadeVenda.getSelectedItem():wink: e deu certo. Vai entender né?..

Criado 14 de abril de 2011
Ultima resposta 15 de abr. de 2011
Respostas 6
Participantes 2