Olá Devs, estou com uma dúvida que não achei em nenhum lugar!
Eu tenho a classe principal, a classe Venda e a Classe Cliente. Os métodos de cada classe não pode mudar. Por exemplo: O método cadastrar( ) da classe Cliente não pode ir para dentro da classe Venda senão resolve o meu problema. Esse método cadastrar( ) precisa ficar dentro da classe Cliente.
Dentro da classe Venda eu tenho um método para finalizar a compra.
O problema está ai: eu preciso mostrar o nome do cliente.
Eu chamo o método cadastrar atraves do objeto, ele cadastra direitinho. (nome e endereço).
O que eu fiz:
Na classe Vendas, criei um atributo nomeCliente do tipo Cliente.
E dentro do método finalizar( ), eu pedi para mostrar nomeCliente.nome. Não deu erro mas quando eu executo dá erro. Segue imagens para melhor entendimento.
Classe Principal
Esse método cadastrar ( ) não pode ir para a classe Venda (sei q isso solucionaria meu problema, porém não posso tirar ela daí)
Ai que está o problema. Não está mostrando o System.out.println(nomeCliente.nome);
tela do erro
Você criou uma variável do tipo Cliente, mas não instanciou o Objeto. Sua variável nomeCliente está vazia, portanto, não possui a propriedade nome
. Isso dispara um NullPointerException. Só fazer isso:
public Cliente nomeCliente = new Cliente();//inclusive, nomeCliente é um nome que não faz muito sentido nessa variável
Assim o erro é resolvido, mas acho que você não vai chegar ao resultado que deseja usando essa implementação
.
Oi Zeca_Peteca!!
Cara, valeu. Fiz as alterações que vc recomendou. O Erro parou , mas está mostrando null. Segue o o print da chamada e o print da Classe.
era para mostrar José
Esse objeto nomeCliente
da classe Venda é diferente do objeto cliente1 que você instanciou na main()
.
Da pra fazer o que você está tentando fazer desse jeito:
public Cliente nomeCliente = new Cliente();//tira essa linha
public void finalizar(Cliente cliente){
Scanner leia = new Scanner(System.in);
int opc;
System.out.println("Deseja realmente finalizar a compra?");
System.out.println("1 - SIM");
System.out.println("2 - NAO");
opc = leia.nextInt();
if (opc == 1){
System.out.println("Cliente: " + cliente.nome);
}
}
Perceba que o método finalizar()
recebe um objeto Cliente como parâmetro, então na main()
passamos como parâmetro o nosso objeto Cliente:
public static void main(String args[]){
Cliente cliente1 = new Cliente();
Venda venda1 = new Venda();
cliente1.nome = "José";
venda1.finalizar(cliente1);
}
O output deve ser: Cliente: José
agora.
1 curtida
@danilomatta Faça como o @Zeca_Peteca passou que vai resolver seu problema.
Apenas para complementar, pense assim:
Geralmente, uma venda é vinculada à um cliente. Com isso, ao finalizar uma venda, normalmente, o cliente já é para ser conhecido pela venda.
Pensando assim, vc pode determinar que toda venda que for criada, precisa ter o cliente informado. E isso pode ser feito assim no código:
Classe Venda
public class Venda {
private final Cliente cliente;
public Venda(Cliente cliente) {
this.cliente = cliente;
}
}
E para criar a venda:
public class ProjetoVendas {
public static void main(String args[]) {
Cliente cliente1 = new Cliente();
cliente1.nome = "José";
Venda venda1 = new Venda(cliente1);
venda1.finalizar();
}
}
Dessa forma, ao finalizar a venda, o cliente já vai está preenchido.
Isso é apenas uma forma de pensar. Da forma como exemplifiquei e como o @Zeca_Peteca postou, dá o mesmo resultado. O que muda é a questão da modelagem das classes e pode fazer diferença na medida que o sistema for evoluindo.
Obs.: Evite ao máximo postar imagens do código. Isso não ajuda em nada. É melhor vc copiar e colar o código aqui formatando usando o botão </> do editor do GUJ. Flws!
1 curtida