1
resposta

Erro: java.lang.NullPointerException

Vi essa dúvida nesse tópico:

https://cursos.alura.com.br/forum/topico-erro-java-lang-nullpointerexception-nao-consegui-identificar-o-erro-copiei-o-material-da-aula-mas-o-erro-persiste-76267

E consegui solucioná-la, mas quando tentei responder o tópico descobri que ele já estava fechado, portanto vou responder aquela dúvida aqui pois ela é bem pertinente e pra mim foi um grande obstáculo.

Fiz certos debugs utilizando de sysout's pelo StackTrace inteiro, e no final das conclusões o problema se encontra aqui:

//imports e annotations omitidos
public class Produto {
    //código omitido
    public BigDecimal precoPara(TipoPreco tipoPreco) {
        return precos.stream().filter(preco -> preco.getTipo().
                equals(tipoPreco)).findFirst().get().getValor();
    }

Nessa parte do código é utilizada uma lambda pra conseguir o valor de um determinado Preco, mas o que ocorre é que no formulário (laaaa atras na hora de cadastrar o produto) deixei o campo de precos em branco, o que gerava essa anomalia, pois na verdade um preço nunca pode ser null, mas isso é exatamente o que esta acontecendo, portanto para resolver isso seria necessário determinar que os campos de preço não poderiam estar nulos.

Isso pode ser feito da mesma maneira come fizemos com o número de páginas (mudamos o field para o tipo int), mas isso não seria possível aqui pois precisamos guardar um valor monetário, então a solução foi setar o valor inicial do BigDecimal valor como 0 , assim o valor não seria null por padrão, e funciona normal desde que eu não deixe em branco os campos do formulário (que já vem escrito 0).

Segue o código:

//imports e annotations omitidos
public class Preco {
    private BigDecimal valor = new BigDecimal(0);
    //código omitido

Vale lembrar que pra funcionar é necessário apagar os produtos já cadastrados pois eles não sofreram uma atualização automática. Apenas os produtos novos terão a "correção".

MAS tem um grande problema aí, o formulário ainda não verifica se os campos estão preenchidos corretamente, então se eu não escrever nada em um dos campos de preço eu teria novamente a NullPointerException, mas pelo menos com essa solução não tem como deixar eles Null sem querer, já que eles já vem com um valor padrão.

Então o problema foi resolvido, mas foi uma solução Band-aid.

Pelo menos agora o código roda. Conto com alguém para ensinar aqui como validar esses campos corretamente.

Desde já agradeço, e espero ter ajudado.

1 resposta
O post foi fechado por inatividade. Para continuar o assunto, recomendamos criar um novo tópico. Bons Estudos!