Usar LinkedList nas Classes Venda e Caixa

Olá a todos!

Espero que estejam bem!

Estou modificando um código antigo que trabalhava com vetores para trabalhar LinkedList, está dando o seguinte erro:

Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The left-hand side of an assignment must be a variable

at Caixa.novaVenda(Caixa.java:26)
at Loja.executar(Loja.java:24)
at Loja.main(Loja.java:14)

Não estou conseguindo descobrir com tirá-lo.
Segue em anexo o código:

public class Caixa {

    private int vendaAberta = -1;
    private  LinkedList<Venda> vendas;
    private int quantidade;

    public Caixa() {
        vendas = new LinkedList<Venda>();
    }

    public void adicionarProduto(Produto produto) {
        vendas.get(vendaAberta).adicionarProduto(produto);
    }

    public Venda novaVenda() {
        vendaAberta++;
        vendas.get(vendaAberta) = new Venda(1);
        quantidade++;
        return vendas.get(vendaAberta);
    }
    
}

public class Cliente {
private String nome;
private String endereco;

public Cliente(String nome, String endereco) {
	this.nome = nome;
	this.endereco = endereco;
}

public Cliente(String nome) {
	this.nome = nome;	
}

public Cliente() {
	
}

public String getNome() {		
	return this.nome;		
}

public void setNome(String nome) {		
	this.nome = nome;
}

public String getEndereco() {		
	return this.endereco;		
}

public void setEndereco(String endereco) {		
	this.endereco = endereco;
}

public String imprimeCliente() {		
	return "Cliente: " + this.nome + "\n Endereco: " + this.endereco;
}

}

import java.io.PrintStream;
import java.util.*;

public class Loja {

public static void main(String[] args) {
	Loja programa = new Loja();
	programa.executar();
}

private final Scanner input = new Scanner(System.in);
private final PrintStream saida = System.out;
	
public void executar() {
	Caixa caixa = new Caixa();
				
	while(continuarVendendo()) {
		Venda venda = caixa.novaVenda();
		Cliente cliente = informarCliente();
		venda.setCliente(cliente);
		informarProdutos(venda);			
	}
}	

private boolean continuarComprando() {
	saida.print("Adicionar produto? [S/N]: ");
	String resposta = input.nextLine();
	saida.println("  ");
	return "S".equalsIgnoreCase(resposta);		
}

private boolean continuarVendendo() {		
	saida.print("Efetuar nova venda? [S/N]: ");
	String resposta = input.nextLine();
	return "S".equalsIgnoreCase(resposta);
}

private Cliente informarCliente() {
	saida.print("Nome do cliente: ");
	String nome = input.nextLine();
	saida.print("Endereco do cliente: ");
	String endereco = input.nextLine();
	return new Cliente(nome, endereco);		
}

private void informarProdutos(Venda venda) {
	
	while (continuarComprando()) {                    
		 
		saida.print("Informe o produto desejado: ");
        String iten = input.nextLine();
        saida.print("Informe o pre�o do produto: ");
        double preco = Double.parseDouble(input.nextLine());
        Produto produto = new Produto(iten, preco);            
        venda.adicionarProduto(produto);
        
        saida.println();
        saida.println(produto.getDescricao() + " adicionado ao carrinho");
        
        saida.println();
        saida.println("Conte�do do carrinho:");
        	for (int i = 0; i < venda.numProdutos(); i++) {
        		produto = venda.produto(i);
        		saida.println("  " + produto.getDescricao() + "    Preco: " + produto.getPreco());
        	}
        saida.println("  ");
        saida.println("  ");
        } 
}

}

public class Produto {

private String descricao;						       
private double preco;
private int total;
	
public Produto(String descricao, double preco) {		
	this.descricao = descricao;
	this.preco = preco;		
}
		
/**
 * @return the descricao
 */
public String getDescricao() {
	return descricao;
}

/**
 * @return the preco
 */
public double getPreco() {
	return preco;
}

public double getTotal() {		
	return total++;		
}

/**
 * @param descricao the descricao to set
 * @return 
 */
public  void setDescricao(String descricao) {
	this.descricao = descricao;
}

/**
 * @param preco the preco to set
 */
public void setPreco(double preco) {
	this.preco = preco;
}

@Overrider
public String toString(String descricao) {
	return "Produto: "  + this.descricao;
}

}

public class Venda {

double total;
private Date data;
private Cliente cliente;
private LinkedList<Produto> produtos;
private int numProdutos;

public Venda(Date data, Cliente cliente, LinkedList<Produto> produtos) {
	this.data = data;
	this.cliente = cliente;
	this.produtos = produtos;
}

public Venda(LinkedList<Produto> produtos) {
	this.produtos = produtos;
}

public Venda(int qtdMaxProdutos) {
	this(new LinkedList<Produto.get(qtdMaxProdutos)>);
}

public void adicionarProduto(Produto produto) {
	produtos.get(numProdutos) = produto;
	numProdutos++;
}

public Produto produto(int posicao) {
	if (posicao < 0) {
		throw new IllegalArgumentException(posicao + " uma posicao invalida");
	}
	if (posicao >= numProdutos) {
		throw new IllegalArgumentException(
				posicao + " uma posicao invalida" + numProdutos + " elementos no vetor");
	}
	return produtos.get(posicao);
}

public int numProdutos() {
	return numProdutos;
}

public void setCliente(Cliente cliente) {
	this.cliente = cliente;
}

public double total() {
	double total = 0;
	for (int i = 0; i < numProdutos; i++) {
		total += produtos.get(i).getPreco();
	}
	return total;
}

public String toString(int i) {
	return data + " " + cliente.getNome() + " " + cliente.getEndereco() + "  " + produtos.get(i).getDescricao() + " "
			+ produtos.get(i).getPreco();
}

}

identar texto pré-formatado por 4 espaços

Erro de sintaxe, não se consegue fazer uma atribuição á um método.

Para adicionar um elemento na sua lista de vendas, faça assim:

vendas.add( new Venda(1) );

Bom dia!

Muito obrigado!

Bom domingo!

Como fica esse trecho do programa?

public Venda(int qtdMaxProdutos) {
	this(new LinkedList<Produto.get(qtdMaxProdutos)>);
}

Tá dando o seguinte erro agora:

at Venda.(Venda.java:22)
at Caixa.novaVenda(Caixa.java:26)
at Loja.executar(Loja.java:24)
at Loja.main(Loja.java:14)

Boa tarde a todos!

Consegui resolver um problema e agora apareceu outro. Estou encaminhando o código com as alterações realizadas.

identar texto pré-formatado por 4 espaços

import java.util.LinkedList;

/**

  • Classe Caixa
  • @version v 1.0 outubro/2020
  • @author MELO, Ewerton
    */

public class Caixa {

private int vendaAberta = -1;
private  LinkedList<Venda> vendas;
private int quantidade;

public Caixa() {
    vendas = new LinkedList<Venda>();
}

public void adicionarProduto(Produto produto) {
    vendas.get(vendaAberta).adicionarProduto(produto);
}

public Venda novaVenda() {
    vendaAberta++;
    vendas.add(new Venda(1));
    quantidade++;
    return vendas.get(vendaAberta);
}

}

public class Cliente {
private String nome;
private String endereco;

public Cliente(String nome, String endereco) {
	this.nome = nome;
	this.endereco = endereco;
}

public Cliente(String nome) {
	this.nome = nome;	
}

public Cliente() {
	
}

public String getNome() {		
	return this.nome;		
}

public void setNome(String nome) {		
	this.nome = nome;
}

public String getEndereco() {		
	return this.endereco;		
}

public void setEndereco(String endereco) {		
	this.endereco = endereco;
}

public String imprimeCliente() {		
	return "Cliente: " + this.nome + "\n Endereco: " + this.endereco;
}

}

/**

  • Classe Loja
  • @version v 1.0 outubro/2020
  • @author MELO, Ewerton
    /
    import java.io.PrintStream;
    import java.util.
    ;

public class Loja {

public static void main(String[] args) {
	Loja programa = new Loja();
	programa.executar();
}

private final Scanner input = new Scanner(System.in);
private final PrintStream saida = System.out;
	
public void executar() {
	Caixa caixa = new Caixa();
				
	while(continuarVendendo()) {
		Venda venda = caixa.novaVenda();
		Cliente cliente = informarCliente();
		venda.setCliente(cliente);
		informarProdutos(venda);			
	}
}	

private boolean continuarComprando() {
	saida.print("Adicionar produto? [S/N]: ");
	String resposta = input.nextLine();
	saida.println("  ");
	return "S".equalsIgnoreCase(resposta);		
}

private boolean continuarVendendo() {		
	saida.print("Efetuar nova venda? [S/N]: ");
	String resposta = input.nextLine();
	return "S".equalsIgnoreCase(resposta);
}

private Cliente informarCliente() {
	saida.print("Nome do cliente: ");
	String nome = input.nextLine();
	saida.print("Endereco do cliente: ");
	String endereco = input.nextLine();
	return new Cliente(nome, endereco);		
}

private void informarProdutos(Venda venda) {
	
	while (continuarComprando()) {                    
		 
		saida.print("Informe o produto desejado: ");
        String iten = input.nextLine();
        saida.print("Informe o preco do produto: ");
        double preco = Double.parseDouble(input.nextLine());
        Produto produto = new Produto(iten, preco);            
        venda.adicionarProduto(produto);
        
        saida.println();
        saida.println(produto.getDescricao() + " adicionado ao carrinho");
        
        saida.println();
        saida.println("Conte�do do carrinho:");
        	for (int i = 0; i < venda.numProdutos(); i++) {
        		produto = venda.produto(i);
        		saida.println("  " + produto.getDescricao() + "    Preco: " + produto.getPreco());
        	}
        saida.println("  ");
        saida.println("  ");
        } 
}

}

import java.util.LinkedList;

/**

  • Classe Produto
  • @version v 1.0 outubro/2020
  • @author MELO, Ewerton
    */

public class Produto {

private String descricao;						       
private double preco;
private int total;
	
public Produto(String descricao, double preco) {		
	this.descricao = descricao;
	this.preco = preco;		
}
		
/**
 * @return the descricao
 */
public String getDescricao() {
	return descricao;
}

/**
 * @return the preco
 */
public double getPreco() {
	return preco;
}

public double getTotal() {		
	return total++;		
}

/**
 * @param descricao the descricao to set
 * @return 
 */
public  void setDescricao(String descricao) {
	this.descricao = descricao;
}

/**
 * @param preco the preco to set
 */
public void setPreco(double preco) {
	this.preco = preco;
}
	
public String toString() {
	return "Produto: "  + this.descricao;
}

public static LinkedList<Produto> get(int qtdMaxProdutos) {
	// TODO Auto-generated method stub
	return null;
}

}

import java.util.*;
import java.util.LinkedList;

public class Venda {

double total;
private Date data;
private Cliente cliente;
private LinkedList<Produto> produtos;
private int numProdutos;

public Venda(Date data, Cliente cliente, LinkedList<Produto> produtos) {
	this.data = data;
	this.cliente = cliente;
	this.produtos = produtos;
}

public Venda(LinkedList<Produto> produtos) {
	this.produtos = produtos;
}

public Venda(int qtdMaxProdutos) {
	this(Produto.get(qtdMaxProdutos));
}

public void adicionarProduto(Produto produto) {
	produtos.add(produto);		
}

public Produto produto(int posicao) {
	if (posicao < 0) {
		throw new IllegalArgumentException(posicao + " uma posicao invalida");
	}
	if (posicao >= numProdutos) {
		throw new IllegalArgumentException(
				posicao + " uma posicao invalida" + numProdutos + " elementos no vetor");
	}
	return produtos.get(posicao);
}

public int numProdutos() {
	return numProdutos;
}

public void setCliente(Cliente cliente) {
	this.cliente = cliente;
}

public double total() {
	double total = 0;
	for (int i = 0; i < numProdutos; i++) {
		total += produtos.get(i).getPreco();
	}
	return total;
}

public String toString(int i) {
	return data + " " + cliente.getNome() + " " + cliente.getEndereco() + "  " + produtos.get(i).getDescricao() + " "
			+ produtos.get(i).getPreco();
}

}

Agradeço desde já pela ajuda!

Ewerton

O erro que está dando é o seguinte:

Nome do cliente: ewew
Endereco do cliente:
Adicionar produto? [S/N]: s

Informe o produto desejado: oleo
Informe o preco do produto: 10
Exception in thread “main” java.lang.NullPointerException
at Venda.adicionarProduto(Venda.java:27)
at Loja.informarProdutos(Loja.java:61)
at Loja.executar(Loja.java:27)
at Loja.main(Loja.java:14)

Ainda não consegui resolver os problemas…

Tá dando erro no Venda(1)

Pra que serve esse método?

E porque você chama ele aqui?

public Venda(int qtdMaxProdutos) {
    this(Produto.get(qtdMaxProdutos));
}

Ele cria um nova venda, chamo como entrada para ser indexado no vetor vendas…
Tava funcionando, depois que coloquei os vetores dinâmicos ele começou a dar problemas.
Um outro problema que aconteceu, é que ele não tá aceitando o construtor Produto como uma variável simples. Pede para criar na classe Produto um construtor como vetor dinâmico para poder funcionar.

public static LinkedList<Produto> get(int qtdMaxProdutos) {
	// TODO Auto-generated method stub
	return null;
}

Quando faço isso ele dar o seguinte erro:

Nome do cliente: ewew
Endereco do cliente:
Adicionar produto? [S/N]: s

Informe o produto desejado: oleo
Informe o preco do produto: 10
Exception in thread “main” java.lang.NullPointerException
at Venda.adicionarProduto(Venda.java:27)
at Loja.informarProdutos(Loja.java:61)
at Loja.executar(Loja.java:27)
at Loja.main(Loja.java:14)

Eu tentei resolver assim:

    public Venda(int qtdMaxProdutos) {
    	this(new LinkedList<Produto.get(qtdMaxProdutos)>);
    }

Mas a sintaxe de lógica e sintaxe tá errada…

Achei que mudar o programa de array para DynamicList seria fácil…

É isso…

Então me explica em qual linha o método abaixo cria uma nova venda e em qual linha ele indexa alguma coisa.

public static LinkedList<Produto> get(int qtdMaxProdutos) {
	// TODO Auto-generated method stub
	return null;
}

Porque 3 construtores tão diferentes?
EM princípio tu não precisa passar nenhuma lista de produtos como parâmetro, já que a classe Venda possui um método para adicionar produtos.

Na época eu estava aprendendo a fazer construtores e foi um pedido no exercício, sobrepor os construtores.

Estou entendendo…

O problema é que o programa tá quebrando quando tento entrar com a qtdMaxProdutos, ele era um indexador do número de vendas existentes mas agora, quando mudou para vetor dinâmico praticamente não preciso dele.

Consegui fazer o programa funcionar. Obrigado!
Mas não está listando os produtos…