Erro na hora de executar Classe Invoice java

13 respostas
java
M

Estou tentando fazer um exercício e não estou entendendo o erro que ta dando na hora q eu compilo. Sou iniciante, quem puder ajudar agradeço.

Exercício:
(Classe Invoice) Crie uma Classe chamada Invoice para que uma loja de suprimentos de informátic possa utilizá-la para representar uma fatura de um item vendido na loja. uma Invoice(fatura) deve incluir quatro partes das informações como variáveis de instância - o número(String), a descrição(String),a quantidade comprada de um item(int) e o preço por item(double). sua classe deve ter um contrutor que inicializa as quatros variáveis de instância. forneça um método set e um get para cada variável de instância. Além disso,forneça um método chamado getInvoiceAmount qye calcula a quantidade de fatura e depois retorna a quantidade como um valor double. se a quantidade nao for positivo, ele dever ser configurada como 0. se o preço por item não for positivo. ele deve ser configurado como 0.0. Escreva um aplicativo de teste chamado InvoiceTeste que demostra as capacidades da Classe Invoice.

Meu código:

Classe: Invoice

package invoice;

public class Invoice {

 String numero;
 String descricao;
 int quantidade;
 double preco;
    

public Invoice(int quantidade0, double price0)
{

    
    if(quantidade0 > 0)
    {
        quantidade = quantidade0;
    }
    else{
        quantidade = 0;
    }
    
    if(price0 > 0.0)
    {
        preco = price0;
    }
    else{
        preco = 0.0;
    }
    }

public void setNumber(String numero)
{
    this.numero = numero;
}
    
public String getNumber()
{
    return numero;
}

public void setDesc(String desc)
{
    this.descricao = desc;
}
    
public String getDesc()
{
    return descricao;
}

public void setQtd(int qtd)
{
    this.quantidade = qtd;
}
    
public int getQtd()
{
    return quantidade;
}

public void setPreco(Double price)
{
    this.preco = price;
}
    
public double getPreco()
{
    return preco;
}
        
public double getInvoiceAmount()
{
    return quantidade * preco;
}

public void displayLine()
{
    System.out.println("Número da fatura: " + getNumber());
    System.out.println("Descrição do produto: " + getDesc());
    System.out.println("Quantidade do produto: " + getQtd());
    System.out.println("Preço do produto: " + getPreco());
}

}

Classe InvoiceTest:

package Invoice;

import java.util.Scanner;

public class InvoiceTest {

    public static void main(String[] args) {
        
        Invoice inv = new Invoice(); 
        
        Scanner input = new Scanner(System.in);
        System.out.println("Quantos produtos deseja colocar na fatura?");
        inv.quantidade = input.nextInt();
        System.out.println("Descreva seu produto");
        inv.descricao = input.next();
        System.out.println("Número da fatura");
        inv.numero = input.nextInt();
        System.out.println("Preço");
        inv.preco = input.nextDouble();
               
      
        inv.displayLine();
        
    }
}

O erro que da qndo eu compilo:

run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: Invoice.Invoice
	at Invoice.InvoiceTest.main(InvoiceTest.java:9)
C:\Users\user\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

13 Respostas

D

na classe InvoiceTest

na classe Invoice

construtores são diferentes, o netbeans deve estar informando este problema

no main troque
Invoice inv = new Invoice();
por
Invoice inv = new Invoice(0, 0);

deve resolver o problema

M

Continua dando o mesmo erro. Tentei também por

Invoice inv = new Invoice(0, 0.0);

mas tb n funcionou

Outra pergunta, para que serve a linha package que o netbeans fornece toda vez q vc cria uma classe?

I

https://www.caelum.com.br/apostila-java-orientacao-objetos/pacotes-organizando-suas-classes-e-bibliotecas/
essa classe Invoice está no package invoice (um nome bem ruim por acaso)
E nessa mesma classe vc tem um construtor com argumentos, logo o seu default sem argumentos não existe, e isso não pode ser feito Invoice inv = new Invoice();
Seu teste está no package Invoice; (O mesmo nome da sua classe, outro nome ruim) não sei nem como o netbens deixa isso, packages com mesmo nome (Não são case sensitive)
quantidade0, geralmente os nomes dos parâmetro são os mesmos dos atributos.
E seus atributos estão sem modificadores de acesso

D

package (pacote) serve para diferenciar classes, pois podem existir varias classes com o mesmo nome. No java, usa o diretório em que está a classe.

Se a declaração do package não for igual ao caminho da classe, o netbeans não vai deixar compilar.

https://www.caelum.com.br/apostila-java-orientacao-objetos/pacotes-organizando-suas-classes-e-bibliotecas/#12-1-organizacao

C

Olá,

Você não está seguindo o enunciado do exercício.

O construtor deve ter quatro parâmetros correspondentes aos atributos da classe.

E o construtor serve para inicializar as variáveis de instância da sua classe. É muito incomum, outra coisa no construtor.

Os getters e setter geralmente seguem a seguinte padronização:

class Invoive {
    ...
    private String numero;

    public String getNumero() { return numero; }
    public void setNumero(String numero) { this.numero = numero; }
    ...
}

As regras de negócio geralmente ficam nos métodos, são esses que trabalham, mais uma vez, você não está seguindo o enunciado do exércicio.

M

Obrigado pelas respostas, alterei meu código novamente. Ele chega a compilar, funciona perfeitamente até a hora que ele do método displayLine, ai da um novo erro.

<strong>Erro:</strong>

Exception in thread “main” java.util.InputMismatchException

at java.util.Scanner.throwFor(Scanner.java:864)

at java.util.Scanner.next(Scanner.java:1485)

at java.util.Scanner.nextDouble(Scanner.java:2413)

at Invoice.InvoiceTest.main(InvoiceTest.java:20)

C:\Users\user\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1

FALHA NA CONSTRUÇÃO (tempo total: 6 segundos)

Classe Invoice

public class Invoice {

 String numero;
 String descricao;
 int quantidade;
 double price;
    

public Invoice(String numero0,String descricao0,int quantidade0, double price0)
{

    numero = numero0;
    descricao = descricao0;
    
    
    if(quantidade0 > 0)
    {
        quantidade = quantidade0;
    }
    else{
        quantidade = 0;
    }
    
    if(price0 > 0.0)
    {
        price = price0;
    }
    else{
        price = 0.0;
    }
    }

public void setNumber(String numero)
{
    this.numero = numero;
}
    
public String getNumber()
{
    return numero;
}

public void setDesc(String descricao)
{
    this.descricao = descricao;
}
    
public String getDesc()
{
    return descricao;
}

public void setQtd(int quantidade)
{
    this.quantidade = quantidade;
}
    
public int getQtd()
{
    return quantidade;
}

public void setPrice(double price)
{
    this.price = price;
}
    
public double getPrice()
{
    return price;
}
        
public double getInvoiceAmount()
{
    return getQtd() * getPrice();
}

public void displayLine()
{
    System.out.println("Número da fatura: " + getNumber());
    System.out.println("Descrição do produto: " + getDesc());
    System.out.println("Quantidade do produto: " + getQtd());
    System.out.println("Preço do produto: " + getPrice());
    System.out.println("Invoice Amount: " + getInvoiceAmount());
}

}

Classe InvoiceTest
import java.util.Scanner;

public class InvoiceTest {

    public static void main(String[] args) {
        
        
        
        
        Scanner input = new Scanner(System.in);
        System.out.println("Quantos produtos deseja colocar na fatura?");
        int qtd = input.nextInt();
        System.out.println("Descreva seu produto");
        String desc = input.next();
        System.out.println("Número da fatura");
        String number = input.next();
        System.out.println("Preço");
        double preco = input.nextDouble();
        
         Invoice inv = new Invoice();
         inv.numero = number;
         inv.descricao = desc;
         inv.quantidade = qtd;
         inv.price = preco;
               
      
        inv.displayLine();
        
    }
}
C

Olá,

Quando você declara um construtor não-default, o construtor default não é implicitamente declarado, você tem que declará-lo explicitamente.

O construtor além de inicializar as variáveis de instância, ele é necessário para criar uma instância da classe, ou seja, criar um objeto da classe.

Assim, por que você está usando o construtor default Invoice() se você não o declarou, ou melhor ainda, onde você está utilizando o construtor de 4 parâmetros que você declarou ?

Você ainda não entendeu a observação que fiz sobre o conteúdo do construtor. Você não coloca regras de negócio dentro dele.

Última observação: é uma má prática de POO acessar as variáveis de instância diretamente, é por isso que existem construtores, getters e setters.

P.S.: qual a apostila ou fonte de referência que você está utilizando ?

C

Olá,

Assim voce está pescando o peixe para ele, ao invés de ensiná-lo a pescar.

C

Olá Tec.Er,

Você fez entender que se usar o construtor não seria necessário usar o setter, mas não é bem isso, não é mesmo, pois se quiser alterar o valor de uma única variável de instância você o fará pelo setter, certo ?!

Por isso, o famoso ditado: para o entendedor, meia palavra basta.

Mas para o não-entendedor, ou seja, iniciante, pode lhe complicar o aprendizado.

T

o erro que ta dando é por que ele ta tentando fazer logica no construtor rs, ao invez de atribui os parametro quu vao ser recebido no construtor , as variaveis.

Voce esta certo cara, mas so quis simplificar rs pior que é. foi vou concerta ja que ele nao viu kk

M

Pessoal, obrigado pelas dicas, eu consegui fazer funcionar direitinho.O erro estava em colocar o “package invoice;” no começo, tirei das duas classes e começou a funcionar. Tentei deixar o código o mais limpo possível, comecei a aprender java agora e estou usando o livro “Como programar em java” da Deitel.

Gostaria de tirar apenas uma duvida.
1)Sempre que eu criar um construtor que não está vazio na hora q eu criar o objeto terei que por algum argumento dentro dele mesmo se eu n for usar esse argumento inicial?

Vou deixar o código aqui, se tiverem alguma dica de como deixa-lo melhor, por favor fale, toda ajuda é bem vinda. Obrigado pela ajuda.

Classe Invoice:

public class Invoice {

 String number;
 String description;
 int quantity;
 double price;
    

public Invoice(String numero,String descricao,int quantidade, double preco)
{

    number = numero;
    description = descricao;
    quantity = quantidade;
    price = preco;
   
    }

public void setNumber(String numero)
{
    number = numero;
}
    
public String getNumber()
{
    return number;
}

public void setDesc(String descricao)
{
    description = descricao;
}
    
public String getDesc()
{
    return description;
}

public void setQtd(int quantidade)
{
     if(quantidade > 0)
        quantity = quantidade;
        else{
            quantity = 0;
        }
}
    
public int getQtd()
{
    return quantity;
}

public void setPrice(double preco)
{
        if(preco > 0)
        price = preco;
        else{
            price = 0;
        }
}
    
public double getPrice()
{
    return price;
}
        
public double getInvoiceAmount()
{
    return getQtd() * getPrice();
}

public void displayLine()
{
    System.out.println("Número da fatura: " + getNumber());
    System.out.println("Descrição do produto: " + getDesc());
    System.out.println("Quantidade do produto: " + getQtd());
    System.out.println("Preço do produto: " + getPrice());
    System.out.printf("Custo Total: R$%.2f\n", getInvoiceAmount());
}

}

Classe InvoiceTest:

import java.util.Scanner;

public class InvoiceTest {

    public static void main(String[] args) {
        
       Invoice inv = new Invoice("001000","Martelo",3,12.2);
       Scanner input = new Scanner(System.in);
         
        System.out.println("Número da Fatura:");
        inv.setNumber(input.next());
        System.out.println("Nome do produto");
        inv.setDesc(input.next());
        System.out.println("Quantidade:");
        inv.setQtd(input.nextInt());
        System.out.println("Preço:");
        inv.setPrice(input.nextDouble());
        
               
        inv.displayLine();
        
    }
}
C

Olá,

Uma vez que você conseguiu, veja outra implementação:

Invoice.java:

package loja.modelo;

public class Invoice {
	private String numero;
	private String descricao;
	private int quantidade;
	private double preco;
	
	public double getInvoiceAmount() {
		if((quantidade < 0) || (preco < 0))
			return 0.0d;
		
		return quantidade*preco;
	}
	
	public Invoice(String numero, String descricao, int quantidade, double preco) {
		this.numero = numero;
		this.descricao = descricao;
		this.quantidade = quantidade;
		this.preco = preco;
	}
	
	public String getNumero() {
		return numero;
	}
	public String getDescricao() {
		return descricao;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public double getPreco() {
		return preco;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
	public void setPreco(double preco) {
		this.preco = preco;
	}
	
	@Override
	public String toString() {
		return "Invoice [numero=" + numero + ", descricao=" + descricao + ", quantidade=" + quantidade + ", preco="
				+ preco + "]";
	}
}

InvoiceTest.java:

package loja.teste;

import java.util.Scanner;

import loja.modelo.Invoice;

public class InvoiceTest {
	public static void main(String[] args) {
		String numero;
		String descricao;
		int quantidade;
		double preco;
		
		Scanner input = new Scanner(System.in);
		System.out.println("Número da fatura");
        numero = input.next();
        System.out.println("Descrição do item");
        descricao = input.next();
        System.out.println("Quantidade do item");
        quantidade = input.nextInt();
        System.out.println("Preço");
        preco = input.nextDouble();
        
        Invoice item = new Invoice(numero, descricao, quantidade, preco);
        
        System.out.println("Item: " + item);
        System.out.println();
        System.out.println("Valor: " + item.getInvoiceAmount());
        
        input.close();
	}
}

Exemplo:

Número da fatura
1
Descrição do item
Coca-cola
Quantidade do item
2
Preço
2,5
Item: Invoice [numero=1, descricao=Coca-cola, quantidade=2, preco=2.5]

Valor: 5.0
T

Po car massa dediqe-se estou no capitutlo 15 deste livro, se dedique em entender cada parte do capitulo anote coiisas inportantes no caderno se possivel, este livro é muito bom tem uns exercicios compilicado outros bons, massa. eu ja resolve este execicio tinha postado mas o colega acima falou uma coisa voce tava pescando e eu te dei o peixe rs, ai exlcuir a resposta mas se dedique faça os exercicio, e a unica forma de aprender.

Criado 26 de março de 2016
Ultima resposta 28 de mar. de 2016
Respostas 13
Participantes 5