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

10 respostas
william2719

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);

10 Respostas

lucas.sampaio

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

staroski

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.

william2719

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

william2719

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

staroski

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?.

william2719

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;
}

}

william2719

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();
    }
}
staroski

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

jallisson_jallis

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

raphaeloneves

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.

Criado 6 de janeiro de 2018
Ultima resposta 12 de jan. de 2018
Respostas 10
Participantes 5