java.lang.Double cannot be cast to java.lang.Long

onde errei? estou aprendendo

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at View.CadProduto.validarFormulario(CadProduto.java:421)
at View.CadProduto.SalvarActionPerformed(CadProduto.java:259)
at View.CadProduto.access$200(CadProduto.java:17)
at View.CadProduto$3.actionPerformed(CadProduto.java:97)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

na linha 421
if (((Double) PrecoCompra.getValue()) <= 0) {
JOptionPane.showMessageDialog(this, “Preço de compra inválido.”, “Alerta”, JOptionPane.WARNING_MESSAGE);
PrecoCompra.requestFocus();
return false;

na linha 259
if (validarFormulario()) {
produto.setNome(NomeProduto.getText().trim());
produto.setPrecoCompra((Double) PrecoCompra.getValue());
produto.setPrecoVenda((Double) PrecoVenda.getValue());

na linha 17
public class CadProduto extends javax.swing.JFrame {

na linha 97
SalvarActionPerformed(evt);

Tenta fazer o cast fora do if e guarda em uma variavel e usa essa variavel no if.

O seu PrecoCompra.getValue() retorna um objeto Long e você está tentando fazer cast para Double.
São tipos de dado incompatíveis.

Lembre-se que long é diferente de Long, assim com double é diferente de Double.

2 curtidas

Poderia me mostrar um exemplo ?
fiz o cast fora, mas quando salvo o valor que aparece é o da variavel e não o que digitei

O código está funcionando exceto quando o decimal do número é 0. Por exemplo, ele funciona quando o valor é “2.1”, mas não quando é “2.0”. Isso é quando ele lança a seguinte exceção:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double

PrecoCompra e PrecoVenda são objetos de qual classe?
O getValue() deles está retornando um objeto da classe Long e você está tentando fazer cast para Double, isso não é possível pois não há polimorfismo entre Long e Double.
Você está ciente de que Long e Double. não são a mesma coisa que long e double?.

public class Produto {

int codigo;
String nome;
Double precoCompra;
Double precoVenda;
int quantidade;



/**
 * @return the codigo
 */
public int getCodigo() {
    return codigo;
}

/**
 * @param codigo the codigo to set
 */
public void setCodigo(int codigo) {
    this.codigo = codigo;
}

/**
 * @return the nome
 */
public String getNome() {
    return nome;
}

/**
 * @param nome the nome to set
 */
public void setNome(String nome) {
    this.nome = nome;
}

/**
 * @return the precoCompra
 */
public Double getPrecoCompra() {
    return precoCompra;
}

/**
 * @param precoCompra the precoCompra to set
 */
public void setPrecoCompra(Double precoCompra) {
    this.precoCompra = precoCompra;
}

/**
 * @return the precoVenda
 */
public Double getPrecoVenda() {
    return precoVenda;
}

/**
 * @param precoVenda the precoVenda to set
 */
public void setPrecoVenda(Double precoVenda) {
    this.precoVenda = precoVenda;
}

/**
 * @return the quantidade
 */
public int getQuantidade() {
    return quantidade;
}

/**
 * @param quantidade the quantidade to set
 */
public void setQuantidade(int quantidade) {
    this.quantidade = quantidade;
}

}

private void SalvarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

    if (validarFormulario()) {
        produto.setNome(NomeProduto.getText().trim());
        produto.setPrecoCompra((Double) PrecoCompra.getValue());
        produto.setPrecoVenda((Double) PrecoVenda.getValue());
                                       
        if (produto.getCodigo() == 0) {
            try {
                controlProduto.inserir(produto);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro ao inserir o produto.\n" + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } else {
            try {
                controlProduto.alterar(produto);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro ao alterar o produto.\n" + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
                return;
            }
        }

        habilitarFormulario(false);
        carregarGrade();
    }
}

No código acima, PrecoCompra e PrecoVenda são objetos de que tipo?

estou com o mesmo problema ao inserir 1.25 ele aceita agora ao inserir 1.00 da a exceção

Como já foi mencionado nas respostas anteriores, não existe compatibilidade entre Long e Double pra se trabalhar com casting, Ao invés de fazer o casting, vc pode optar pela transformação abaixo:

Long l = new Long(1234);
Double db =  new Double(l.longValue());
System.out.println(db); //1234.0

No seu contexto, poderia ser algo do tipo:

produto.setPrecoCompra(new Double(PrecoCompra.getValue().longValue())); ou simplesmente alterar o método getValue() pra ja fazer esse processo de conversão e devolver um Double diretamente.

1 curtida