Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Posible causa del NullPointerException al ordenar episodios (caso Episodio y fechaLanzamiento)

Estoy siguiendo el curso paso a paso y me encontré con este error al convertir DatosEpisodio a mi clase Episodio y luego intentar ordenar la lista de episodios:

java.lang.NullPointerException: Cannot invoke "java.lang.Comparable.compareTo(Object)" 
because the return value of "java.util.function.Function.apply(Object)" is null

Al principio pensé que el problema venía de la evaluación "N/A" o de algún Double.valueOf(), pero al revisar más a fondo descubrí algo importante:
El error no venía de evaluacion(), sino de fechaDeLanzamiento.
En el constructor de Episodio, cuando el API devuelve una fecha inválida, se ejecuta el catch:

try {
    this.fechaLanzamiento = LocalDate.parse(d.fechaDeLanzamiento());
} catch (DateTimeParseException e) {
    this.fechaLanzamiento = null;
}

Esto significa que algunos episodios quedan con null ycuando más adelante hacemos:

episodios.stream()
....
    .sorted(Comparator.comparing(Episodio::getFechaLanzamiento))
    .toList();

Java intenta ejecutar internamente fechaLanzamiento.compareTo(otraFecha) y si una de las fechas es null, el Comparator lanza el NullPointerException.

A la solucion que llegue despues de 3 horas de analisis de mi error y la logica de mi codigo con chatgpt fue permitir fechas nulas indicandole al Comparator qué hacer con ellas.

.sorted(
    Comparator.comparing(
        Episodio::getFechaLanzamiento,
        Comparator.nullsFirst(Comparator.naturalOrder())
    )
)
1 respuesta

Hola Carolina, espero que estés bien

¡Qué bueno que has encontrado una solución a tu problema! Parece que has hecho un gran trabajo al identificar que el problema estaba relacionado con las fechas nulas en tu lista de episodios. El uso del Comparator.nullsFirst es una excelente manera de manejar los valores nulos al ordenar, asegurando que no se produzcan excepciones inesperadas.

Para darte un ejemplo práctico, imagina que tienes una lista de episodios de una serie, y algunos de ellos aún no tienen una fecha de lanzamiento definida. Al usar Comparator.nullsFirst, puedes asegurarte de que estos episodios sin fecha se coloquen al principio de la lista, o al final si usas Comparator.nullsLast, dependiendo de cómo prefieras ordenarlos.

Tu implementación quedaría algo así:

episodios.stream()
    .sorted(
        Comparator.comparing(
            Episodio::getFechaLanzamiento,
            Comparator.nullsFirst(Comparator.naturalOrder())
        )
    )
    .toList();

Esto debería ayudarte a evitar el NullPointerException que estabas experimentando. Es importante recordar que el manejo de valores nulos es crucial en muchos escenarios, especialmente cuando se trabaja con datos que pueden ser incompletos o que dependen de una fuente externa.

Espero que esta explicación te haya sido útil y te deseo mucho éxito en tus estudios y proyectos con Java. ¡Sigue adelante!

Espero haber ayudado y buenos estudios!