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

Dúvida no Ex. 1 da Aula 5 - Estados que variam e o State

Segui a etapa Explicação para resolver o exercício, porem ocorre uma exception NullPointerException. Pude verificar que é devido a falha na inicialização do estado. O programa teste não está aceitando o construtor:

public Orcamento() { 
    this.estadoAtual = new EmAprovacao(); 
}

Agora se eu faço como foi demonstrado no vídeo:

    public Orcamento(double valor) {
        this.valor = valor;
        this.itens = new ArrayList<Item>();
        this.estadoAtual = new EmAprovacao();
    }

o programa funciona. Podem me explicar onde está o erro?

7 respostas

Oi Marcio,

Cola o erro pra vermos em qual linha ocorre o NullPointer?

Abraço!

Exception in thread "main" java.lang.NullPointerException at br.alura.modelo.Orcamento.aplicaDescontoExtra(Orcamento.java:40) at br.alura.modelo.TesteDoDescontoExtra.main(TesteDoDescontoExtra.java:9)

Oi Marcio,

O NullPointer está ocorrendo na sua classe Orcamento na linha 40. Coloca aí agora o código da sua classe marcando qual é a linha 40.

Abraço!

package br.alura.modelo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.alura.chainofresponsability.Item;

public class Orcamento {

    protected double valor;
    private List<Item> itens;
    protected EstadoDeUmOrcamento estadoAtual;


    public Orcamento(double valor) {
        this.valor = valor;
        this.itens = new ArrayList<Item>();
//        this.estadoAtual = new EmAprovacao();
    }

    public double getValor() {
        return valor;
    }

    public List<Item> getItens() {
        return Collections.unmodifiableList(itens);
    }

    public void adicionaItem(Item item) {
        itens.add(item);
    }

    // demonstrar o padrão STATE
    public Orcamento() {
        this.estadoAtual = new EmAprovacao();
    }

    public void aplicaDescontoExtra() {
/* linha 40 */        estadoAtual.aplicaDescontoExtra(this);
    }

    public void aprova() {
        this.estadoAtual.aprova(this);
    }
    public void reprova() {
        this.estadoAtual.reprova(this);
    }
    public void finaliza() {
        this.estadoAtual.finaliza(this);
    }

}
package br.alura.modelo;

// demonstrar o padrão STATE
public interface EstadoDeUmOrcamento {

    void aplicaDescontoExtra(Orcamento orcamento);

    void aprova(Orcamento orcamento);
    void reprova(Orcamento orcamento);
    void finaliza(Orcamento orcamento);

}

Marcio,

O erro está ocorrendo pois a sua variável estadoAtual está nula. Provavelmente você está instanciando seu Orcamento da seguinte forma:

Orcamento o = new Orcamento(100.5);

Porém este construtor possui a linha do estadoAtual comentada, ficando com nulo lá dentro.

public Orcamento(double valor) {
    // this.estadoAtual = new EmAprovacao();
}

Para parar de dar o NullPointer, você precisa descomentar esta linha.

Abraço!

solução!

Acho que você não entendeu a minha questão inicial. Foi eu que comentei para explicar que existe uma diferença entre o tópico Explicação e o Vídeo.

Na explicação é criado um novo construtor para inicializar o estadoAtual e no vídeo o instrutor demonstra a inicialização no mesmo construtor que já tinha os outros atributos da classe.

o erro null ocorre quando sigo somente o tópico explicação que não inicializa o atributo estadoAtual no mesmo construtor.

O programa funciona seguindo a demonstração do vídeo. Vou ficar com isso. Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software