Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 2 da Aula 2 - Muitos Descontos e o Chain of Responsibility

Caros, estou tentando simular caso não tenha nenhum desconto.

Porém é exibido a mensagem de erro

Valor do Orcamento: 30.0
Qtde de Produtos do orcamento: 2
Exception in thread "main" java.lang.NullPointerException
    at Calculadora.DescontoPorVendaCasada.desconta(DescontoPorVendaCasada.java:21)
    at Calculadora.DescontoValorMaiorQuinhentos.desconta(DescontoValorMaiorQuinhentos.java:16)
    at Calculadora.DescontoCincoItens.desconta(DescontoCincoItens.java:16)
    at Calculadora.CalculadoraDeDescontos.calcula(CalculadoraDeDescontos.java:17)
    at Calculadora.TestaDesconto.main(TestaDesconto.java:16)

SEGUE O MEU CÓDIGO

public class DescontoPorVendaCasada implements Desconto {

    private Desconto proximo;

    @Override
    public double desconta(Orcamento orcamento) {

        if (this.buscaProduto(orcamento, "LAPIS")
                && this.buscaProduto(orcamento, "CANETA")) {

            return orcamento.getValor() * 0.05;

        } else {
            return proximo.desconta(orcamento);

        }

    }

    public boolean buscaProduto(Orcamento orcamento, String nome) {
        for (Produto produto : orcamento.getProdutos()) {
            if (produto.getNome().equals(nome))
                return true;
        }

        return false;

    }

    @Override
    public void proximoDesconto(Desconto desconto) {
        this.proximo = proximo;

    }


public class DescontoValorMaiorQuinhentos implements Desconto {

    private Desconto proximo;

    @Override
    public double desconta(Orcamento orcamento) {

        if (orcamento.getValor() >=500)
            return orcamento.getValor() * 0.07;
        else

            return proximo.desconta(orcamento);
    }


    public void proximoDesconto(Desconto proximo) {
        this.proximo = proximo;

    }

}


public class SemDesconto implements Desconto {

    @Override
    public double desconta(Orcamento orcamento) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void proximoDesconto(Desconto desconto) {
        // nao tem!

    }

}


public class DescontoCincoItens implements Desconto {

    private Desconto proximo;

    @Override
    public double desconta(Orcamento orcamento) {

        if (orcamento.getProdutos().size() >= 5)
            return orcamento.getValor() * 0.10;

        else
            return proximo.desconta(orcamento);
    }

    @Override
    public void proximoDesconto(Desconto proximo) {
        this.proximo = proximo;

    }

}

}

public interface Desconto {

    double desconta(Orcamento orcamento);

    void proximoDesconto (Desconto desconto);



}



public class CalculadoraDeDescontos {

    public double calcula(Orcamento orcamento)  {


        Desconto d1 = new DescontoCincoItens();
        Desconto d2 = new DescontoValorMaiorQuinhentos();
        Desconto d3 = new DescontoPorVendaCasada();
        Desconto d4 = new SemDesconto();


        d1.proximoDesconto(d2);
        d2.proximoDesconto(d3);
        d3.proximoDesconto(d4);
        return d1.desconta(orcamento);


    }


}

public class Produto {

    private String nome;
    private double valor;

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

    public String getNome() {
        return nome;
    }

    public double getValor() {
        return valor;
    }

}

public class TestaDesconto {

    public static void main(String[] args) {

        Orcamento orcamento = new Orcamento(30);
        orcamento.adicionaProduto(new Produto("LAPIS", 10));
        orcamento.adicionaProduto(new Produto("REGUA", 20));


        CalculadoraDeDescontos calculadora = new CalculadoraDeDescontos();

        System.out.println("Valor do Orcamento: " + orcamento.getValor());
        System.out.println("Qtde de Produtos do orcamento: " + orcamento.getProdutos().size());
        System.out.println("Valor do desconto = " + calculadora.calcula(orcamento));


    }

}
2 respostas
solução!

Olá Mary! O erro está sendo causado por um pequeno equivoco seu na classe DescontoPorVendaCasada no método proximoDesconto. Perceba que o nome do parâmetro não condiz com o que você deseja atribuir para a variavel de instancia:

@Override
    public void proximoDesconto(Desconto desconto) {
        this.proximo = proximo;

    }

O correto seria estar:

@Override
    public void proximoDesconto(Desconto proximo) {
        this.proximo = proximo;

    }

Espero ter ajudado! Bons Estudos!

Romário, muito obrigada. olhei o código diversas vezes e não conseguia encontrar o erro. ainda bem que vem me ajudou. muito obrigada! abs,