Acesso de atributos de outra classe - dando erro

Pessoal preciso de um esclarecimento.
Estou tentando acessar o getValor e outros get´s de outra classe.
mesmo fazendo o relacionamento “Tem Um” (coloquei o tipo de uma variável como a classe que quero acessar).
Não consigo acessar os get´s e sets dessa outra classe…
Vou colocar o código, espero que alguém possa me esclarecer se estou fazendo errado.

Classe Cliente que possui uma variável do tipo Produto - os itens (item.getNome; item.getValor não consigo pegar eles)

public class Cliente {

private String nome;
private int quantidade;
private double dinheiro;
public Produto item;

public Cliente(String nome, int quantidade, double dinheiro) {
	super();
	this.nome = nome;
	this.quantidade = quantidade;
	this.dinheiro = dinheiro;
}

public void comprar(Produto i) {
	if(this.getDinheiro()>= item.getValor()) {
	this.setDinheiro(this.getDinheiro()- item.getValor());
	this.setQuantidade(this.getQuantidade()+1);
	System.out.println("Você comprou um " + item.getNome() + " e seu saldo agora é "+ this.getDinheiro());
	System.out.println(item.getTipo());
	}else {
		JOptionPane.showMessageDialog(null, "Você não possui dinheiro suficiente");
	}
}

A Classe Produto que fornece as informações.

public class Produto {

private  String nome;
private String tipo;
private double valor;

public Produto(String nome, String tipo, double valor) {
	this.nome = nome;
	this.tipo = tipo;
	this.valor = valor;
}

public String getNome() {
	return nome;
}

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

public String getTipo() {
	return tipo;
}

public void setTipo(String tipo) {
	this.tipo = tipo;
}

public double getValor() {
	return valor;
}

public void setValor(double valor) {
	this.valor = valor;
}

@Override
public String toString() {
	return "Produto [nome=" + nome + ", tipo=" + tipo + ", valor=" + valor + "]";
}

}

Você nomeou o parâmetro do método comprar como i, e está acessando o produto item. São duas coisas diferentes. Se você instanciar um objeto da classe Cliente e chamar o método comprar antes de setar o item desse cliente, vai tomar um NullPointerException.

Qual o erro que está acontecendo?

Ivbarbosa boa tarde.

Então eu coloquei o nome do parâmetro como “item” também e da a mesa coisa, ai tentei mudar para “i”, esta dando o erro - java.lang.NullPointerException-
já to a mais de um dia tentando aqui e nada.

O NullPointerException acontece porque você está tentando fazer alguma operação em uma referência que não foi inicializada. Por exemplo:

Produto p; // Se você tentar acessar qualquer coisa de p, vai acontecer um NullPointerException
...
p = new Produto(); // A partir de agora, pode acessar os membros de p.

Na mensagem de erro deve dizer aonde está acontecendo o problema. Não tenho como saber onde é sem ter todas as informações.

Reescrevi o código desde o inicio e deu certo, não sei porque estava dando erro.
Mais uma duvida, se puder ajudar, o método abaixo develverProduto, não consigo fazer o dinheiro ser ressarcido, como deve ser o código para atribuição dentro do setDinheiro.

public void devolverProduto() {
if(this.getQuantidade() >0) {
this.setQuantidade(this.getQuantidade()-1);
this.setDinheiro(this.getDinheiro()+item.getValor()); // esta dando erro nessa linha
System.out.println(“Você devolveu o produto e seu dinheiro foi ressarcido” + this.getDinheiro());
}

Os métodos setDinheiro() e getDinheiro() vem de onde? Você está invocando o construtor da superclasse - super(). Qual é a superclasse de Cliente? Por enquanto, está chamando o construtor da classe Object.

Fiz um teste e funcionou. Veja:

1 - Produto

public class Produto {
	private String nome;
	private String tipo;
	private double valor;

	public Produto(String nome, String tipo, double valor) {
		this.nome = nome;
		this.tipo = tipo;
		this.valor = valor;
	}
	
	public String getNome() {
		return nome;
	}

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

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	@Override
	public String toString() {
		return "Produto [nome=" + nome + ", tipo=" + tipo + ", valor=" + valor + "]";
	}
}

2 - Cliente

public class Cliente {
	private String nome;
	private int quantidade;
	private double dinheiro;
	public Produto item;

	public Cliente(String nome, int quantidade, double dinheiro) {
		//super();
		this.nome = nome;
		this.quantidade = quantidade;
		this.dinheiro = dinheiro;
	}

	public void comprar(Produto item) {
		if(this.getDinheiro() >= item.getValor()) {
			this.setDinheiro(this.getDinheiro() - item.getValor());
			this.setQuantidade(this.getQuantidade() + 1);
			System.out.println("Você comprou um " + item.getNome() + " e seu saldo agora é " 
				+ this.getDinheiro());
			System.out.println(item.getTipo());
		}else {
			javax.swing.JOptionPane.showMessageDialog(null, "Você não possui dinheiro suficiente");
		}
	}
	
	public void setNome(String nome){
		this.nome = nome;
	}
	
	public String getNome(){
		return nome;
	}
	
	public void setQuantidade(int quantidade){
		this.quantidade = quantidade;
	}
	
	public int getQuantidade(){
		return quantidade;
	}
	
	public void setDinheiro(double dinheiro){
		this.dinheiro = dinheiro;
	}
	
	public double getDinheiro(){
		return dinheiro;
	}
}

3 - Teste

public class Teste {
	public static void main(String[] args){
		Produto p1 = new Produto("Achocolatado", "Produto alimentício", 4.17);
		Produto p2 = new Produto("Sabão em pó", "Produto de limpeza", 12.39);
		Produto p3 = new Produto("Guardanapo", "Utilidades", 2.67);
		
		Cliente c1 = new Cliente("Fulano", 5, 122.00);
		Cliente c2 = new Cliente("Beltrano", 4, 220.00);
		Cliente c3 = new Cliente("Sicrano", 9, 345.50);
		
		c1.comprar(p1);
	}
}

Rodando…

image

Mas o cálculo está errado… nisso eu não mexi.

Iohannes
Valew Iohannes, eu reescrevi e deu certo.
Realmente o codigo de calculo eu arrumei.

Outro ponto que eu estou tendo dificuldade é em colocar o dinheiro de volta pelo método devolverProduto.
O não consigo fazer o dinheiro ser ressarcido.

public void devolverProduto() {
if(this.getQuantidade() >0) {
this.setQuantidade(this.getQuantidade()-1);
this.setDinheiro(this.getDinheiro()+item.getValor()); // esta dando erro nessa linha
System.out.println(“Você devolveu o produto e seu dinheiro foi ressarcido” + this.getDinheiro());

O cálculo correto é : this.getDinheiro - (this.quantidade() * item.valor()); Ou seja:

public void comprar(Produto item) {
	if(this.getDinheiro() >= item.getValor()) {
		
		this.setDinheiro(this.getDinheiro() - (this.getQuantidade() * item.getValor()));
		//this.setQuantidade(this.getQuantidade());
		System.out.println("Você comprou " + this.getQuantidade() + " " + item.getNome() 
			+ "(s) e seu saldo agora é R$ " + this.getDinheiro() + ".");
		System.out.println("Tipo: "+ item.getTipo());
	}else {
		javax.swing.JOptionPane.showMessageDialog(null, "Você não possui dinheiro suficiente");
	}
}

Logo:

image

A classe Cliente poderia ficar assim:

public class Cliente {
	private String nome;
	private int quantidade;
	private double dinheiro;
	public Produto item;

	public Cliente(String nome, int quantidade, double dinheiro) {
		//super();
		this.nome = nome;
		this.quantidade = quantidade;
		this.dinheiro = dinheiro;
	}

	public void comprar(Produto item) {
		if(this.getDinheiro() >= item.getValor()) {
			setProduto(item);
			this.setDinheiro(this.getDinheiro() - (this.getQuantidade() * item.getValor()));
			System.out.println("Você comprou " + this.getQuantidade() + " " + item.getNome() 
				+ "(s) e seu saldo agora é R$ " + this.getDinheiro() + ".");
			System.out.println("Tipo: "+ item.getTipo());
		}else {
			javax.swing.JOptionPane.showMessageDialog(null, "Você não possui dinheiro suficiente");
		}
	}
	
	public void devolverProduto(int quantidade, Produto item){
		if(this.getProduto() != null){
			if(this.getProduto().getNome().equals(item.getNome())){
				if(quantidade >= this.getQuantidade())
					quantidade = getQuantidade();
					
				double valorReembolso = item.getValor() * quantidade;
				this.setDinheiro(this.getDinheiro() + valorReembolso);
				this.setQuantidade(getQuantidade() - quantidade);
					
				System.out.println("\n\nO cliente " + this.getNome() + " devolveu " + quantidade 
					+ " unidades do produto " + item.getNome() + "\nProduto(s) mantidos : " 
					+ this.getQuantidade() + "\nReembolso: R$ " + valorReembolso 
					+ "\nSaldo atual: R$ " + Math.floor(this.getDinheiro()));
			}else
				System.out.println("\n\nO produto " + item.getNome() 
				+ " não foi comprado pelo cliente " + this.getNome() + ".");
			
		}else
			System.out.println("\n\nO cliente " + this.getNome() + " não comprou nenhum produto.");
	}
	
	public void setNome(String nome){
		this.nome = nome;
	}
	
	public String getNome(){
		return nome;
	}
	
	public void setQuantidade(int quantidade){
		this.quantidade = quantidade;
	}
	
	public int getQuantidade(){
		return quantidade;
	}
	
	public void setDinheiro(double dinheiro){
		this.dinheiro = dinheiro;
	}
	
	public double getDinheiro(){
		return dinheiro;
	}
	
	public void setProduto(Produto item){
		this.item = item;
	}
	
	public Produto getProduto(){
		return item;
	}
}

Rodando…

image

Nesse caso, informa-se do total de produtos, quantos se quer devolver. Se for passado um valor maior a se devolver que o comprado, simplesmente devolve tudo. No exemplo passei 9 itens. Logo, devolverá todos os 5.

Iohannes
Nossa muito obrigado.
Deu certo, eu peguei a sua ideia de colocar 2 parâmetros no método devolver e resolveu minha vida.
valeu pela ajuda, estou iniciando no java e seu código ficou muito bom.
ja clareou as ideias aqui. valew mesmo.