Erro na hora de executar Classe Invoice java

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)

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

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?

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

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

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.

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.

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

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 ?

Olá,

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

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.

1 curtida

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

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

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

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.