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

[Bug] Testando o código da aula ...

Olá amigos, bom...fui curioso e estou , junto com o código da aula, testando para ver o comportamento do código. No caso do validações, o código que verifica o período apresentou um erro. Gostaria de saber se alguém pegou o mesmo erro e conseguiu solucionar....segue o código do teste:

package br.com.alura.rh.teste;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import br.com.alura.rh.model.Cargo;
import br.com.alura.rh.model.Funcionario;
import br.com.alura.rh.service.ReajusteService;
import br.com.alura.rh.service.ValidacaoPercentualReajuste;
import br.com.alura.rh.service.ValidacaoPeriodicidadeEntreReajustes;
import br.com.alura.rh.service.ValidacaoReajuste;

public class TesteReajuste {

    public static void main(String[] args) {
        Funcionario pedro = new Funcionario("Pedro", "123.456.789-10", Cargo.ASSISTENTE, new BigDecimal("3500.00"));
        BigDecimal aumento = new BigDecimal("1350.00");

        ValidacaoPercentualReajuste percentualReajuste = new ValidacaoPercentualReajuste();
        ValidacaoPeriodicidadeEntreReajustes periodoReajuste = new ValidacaoPeriodicidadeEntreReajustes();

        percentualReajuste.validar(pedro,aumento );
        periodoReajuste.validar(pedro,aumento);

        List<ValidacaoReajuste> listaValidacoes = new ArrayList<>();

        listaValidacoes.add(periodoReajuste);
        listaValidacoes.add(percentualReajuste);

        ReajusteService novoReajuste = new ReajusteService(listaValidacoes);

        novoReajuste.reajustarSalario(pedro,aumento);

        System.out.println(pedro.getSalario());
    }

}

Segue o erro apresentado :

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.time.temporal.Temporal.until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit)" because "temporal1Inclusive" is null
    at java.base/java.time.temporal.ChronoUnit.between(ChronoUnit.java:272)
    at br.com.alura.rh.service.ValidacaoPeriodicidadeEntreReajustes.validar(ValidacaoPeriodicidadeEntreReajustes.java:18)
    at br.com.alura.rh.teste.TesteReajuste.main(TesteReajuste.java:24)

As classes de validação são as mesmas da aula...tomei o cuidado de copiar exatamente igual neste ultimo caso pq detectei o erro ...pensei que poderia ser algum erro de digitação , então refiz igual ao código do instrutor...

3 respostas

Oioi Vanderson! Tudo certinho?

Consegue me mandar sua classe ValidacaoPeriodicidadeEntreReajustes? Aparentemente o erro vem de algo que está nela.

Olá Iasmin, perdão pela demora...como não era o foco do curso os testes, segui a diante e concluí a formação...acabei não dando muita bola pro forúm...mas, gosto de ir atrás de solução !!! Taí o código da classe :

ackage br.com.alura.rh.service.reajuste;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

import br.com.alura.rh.ValidacaoException;
import br.com.alura.rh.model.Funcionario;

public class ValidacaoPeriodicidadeEntreReajustes implements ValidacaoReajuste {

    public void validar(Funcionario funcionario , BigDecimal aumento) {

        LocalDate ultimoReajuste = funcionario.getDataUltimoReajuste();
        LocalDate hoje = LocalDate.now();


        long quantidadeDeMesesdoUltimoReajuste = ChronoUnit.MONTHS.between(ultimoReajuste, hoje);
        if(quantidadeDeMesesdoUltimoReajuste  < 6) {
            throw new ValidacaoException("Reajuste nao deve ser realizado em um prazo menor que 6 meses");
        }

    }

}

O código é o mesmo do instrutor do curso, mas como não tinha teste, passou despercebido por ele. Parece ser algo relacionado a esta API ChronoUnit ...

solução!

Oi Vanderson!

Na verdade tem um bug no código mesmo. Como o foco do curso eram os princípios SOLID e não teve testes, acabou passando batido esse detalhe.

O erro acontece nessa linha:

ChronoUnit.MONTHS.between(ultimoReajuste, hoje);

O primeiro parâmetro está null e com isso ocorre o NullPointerException. Esse é o cenário do funcionário nunca ter recebido reajuste, então o código deveria tratar isso:

public void validar(Funcionario funcionario , BigDecimal aumento) {
    LocalDate ultimoReajuste = funcionario.getDataUltimoReajuste();
    if (ultimoReajuste == null) {
        return;
    }

    LocalDate hoje = LocalDate.now();
    long quantidadeDeMesesdoUltimoReajuste = ChronoUnit.MONTHS.between(ultimoReajuste, hoje);
    if(quantidadeDeMesesdoUltimoReajuste  < 6) {
        throw new ValidacaoException("Reajuste nao deve ser realizado em um prazo menor que 6 meses");
    }
}

Bons estudos!