Vi essa dúvida nesse tópico:
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.