1
resposta

[Bug] OptionalDouble não lida com exceções

Fiquei cético acerca do emprego do OptionalDouble para a conversão numérica para double:

this.avaliacao = OptionalDouble.of(Double.valueOf(dadosSerie.avaliacao())).orElse(0);

Para comprovar, testei no jshell e obtive as seguintes saídas:

jshell> java.util.OptionalDouble.of(Double.valueOf("N/A")).orElse(0);
|  Exception java.lang.NumberFormatException: For input string: "N/A"
|        at FloatingDecimal.readJavaFormatString (FloatingDecimal.java:2054)
|        at FloatingDecimal.parseDouble (FloatingDecimal.java:110)
|        at Double.parseDouble (Double.java:651)
|        at Double.valueOf (Double.java:614)
|        at (#1:1)

jshell> java.util.OptionalDouble.of(Double.valueOf(null)).orElse(0);
|  Exception java.lang.NullPointerException: Cannot invoke "String.trim()" because "in" is null
|        at FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1838)
|        at FloatingDecimal.parseDouble (FloatingDecimal.java:110)
|        at Double.parseDouble (Double.java:651)
|        at Double.valueOf (Double.java:614)
|        at (#2:1)

Aparentemente o emprego do OptionalDouble não substitui o da tratativa de exceções.

1 resposta

Oi Ian! Como vai?

De fato, o OptionalDouble não lida com exceções que podem ocorrer durante a conversão de String para Double. A exceção NumberFormatException que você encontrou é lançada antes mesmo de o OptionalDouble entrar em ação, pois o erro ocorre na tentativa de converter a String para Double.

Para lidar com isso de forma mais segura, você pode usar um bloco try-catch para capturar a exceção e definir um valor padrão, como 0.0, caso a conversão falhe. Aqui está um exemplo de como você pode fazer isso:

public Serie(DadosSerie dadosSerie){
    this.titulo = dadosSerie.titulo();
    this.totalTemporadas = dadosSerie.totalTemporadas();
    try {
        this.avaliacao = Double.valueOf(dadosSerie.avaliacao());
    } catch (NumberFormatException e) {
        this.avaliacao = 0.0;
    }
    this.genero = Categoria.fromString(dadosSerie.genero().split(",")[0].trim());
    this.atores = dadosSerie.atores();
    this.poster = dadosSerie.poster();
    this.sinopse = dadosSerie.sinopse();
}

Dessa forma, você garante que qualquer problema na conversão de String para Double não causará uma falha no seu programa, e você ainda poderá usar o OptionalDouble se necessário, mas para outras finalidades.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.