Duvida -> NullPointerException

Boa tarde pessoal, estou resolvendo um código e está dando NullPointerException, alguém poderia me dar uma ajuda com ele?
Tenho que criar uma caixa de mercado, em uma classe estão as características dos produtos e em outra estão as informações do Caixa com um método para calcular o valor final da compra.

Segue abaixo como eu fiz, não consegui identificar meu erro…

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

    public String getNome() {
        return nome;
    }

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

    public double getValor() {
        return valor;
    }

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

    public int getTipo() {
        return tipo;
    }

    public void setTipo(int tipo) {
            this.tipo = tipo;

    }

    public Produto(String nome, double valor, int tipo) {
        this.nome = nome;
        this.valor = valor;
        this.tipo = tipo;
    }
}
public class Caixa {
    public Produto produto;
    public int quantidade;

    public void calcularValorFinal(Produto produto,int quantidade) {
        double totalValorFinal;
        if (this.getProduto().tipo == 1) {
            totalValorFinal = ((this.getProduto().valor * quantidade) - ((this.getProduto().valor * quantidade) * 0.10));
            System.out.println("Valor Final do Produto " + this.getProduto() + totalValorFinal);
        } else if(this.getProduto().tipo ==2){
            totalValorFinal = ((this.getProduto().valor * quantidade) - ((this.getProduto().valor * quantidade) * 0.20));
            System.out.println("Valor Final do Produto " + this.getProduto() + totalValorFinal);
        }else if(this.getProduto().tipo ==3) {
            totalValorFinal = ((this.getProduto().valor * quantidade) - ((this.getProduto().valor * quantidade) * 0.30));
            System.out.println("Valor Final do Produto " + this.getProduto() + totalValorFinal);

        }
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }
}
public class Main {
    public static void main(String[] args) {
        Produto banana = new Produto("banana", 0.99d, 2);
        Produto energetico = new Produto("energetico", 5.49d, 3);
        Produto arroz = new Produto("arroz", 20d, 1);
        Produto chocolate = new Produto("chocolate", 4.50d, 1);
        Produto leite = new Produto("leite", 3.73d, 3);
        Produto abacaxi = new Produto("abacaxi", 2.40d, 2);

        Caixa valorFinal = new Caixa();
        valorFinal.calcularValorFinal(banana, 3);
        valorFinal.calcularValorFinal(energetico, 7);
        valorFinal.calcularValorFinal(arroz, 1);
        valorFinal.calcularValorFinal(chocolate, 12);
        valorFinal.calcularValorFinal(leite, 5);
        valorFinal.calcularValorFinal(abacaxi, 1);
    }
}

No método calcularValorFinal, vc está usando a variável this.produto que está declarada na classe (por causa do this), e o correto seria usar o produto que está chegando por parâmetro.

A variável produto da classe Caixa não é inicializada em nenhum momento.

Olá, muito obrigada pela ajuda!