Hola Lucas, espero que estés bien
Entiendo tu confusión sobre por qué extender RuntimeException en lugar de Throwable. Aquí te explico un poco más sobre esto:
Throwable es la clase madre de todas las excepciones y errores en Java. Sin embargo, en la práctica, no se suele extender directamente de Throwable porque Java proporciona dos subclases más específicas: Exception y Error. Exception es la clase base para todas las excepciones que un programa puede querer capturar y manejar, mientras que Error es para problemas más serios que normalmente no se deben manejar en el código.
Dentro de Exception, tenemos RuntimeException, que es una clase especial para excepciones que pueden ocurrir durante la ejecución del programa y que no necesitan ser declaradas en un throws ni ser capturadas obligatoriamente. Esto es útil para excepciones que indican errores de programación, como intentar acceder a un índice fuera de los límites de un array, o en tu caso, un error en la conversión de duración.
Al extender RuntimeException, estás indicando que ErrorEnConversionDeDuracionException es una excepción que puede ocurrir en tiempo de ejecución y que no es necesario forzar al programador a manejarla explícitamente. Esto hace que el código sea más limpio y enfocado en los errores que realmente se espera manejar.
Un ejemplo práctico sería:
if (miTituloOmdb.runtime().contains("N/A")) {
throw new ErrorEnConversionDeDuracionException("No pude convertir la duracion, porque contiene un N/A");
}
Aquí, si el tiempo de ejecución contiene "N/A", lanzas tu excepción personalizada. Como es una RuntimeException, no necesitas declarar que el método Titulo lanza esta excepción, lo que simplifica el manejo de errores en tu código.
Espero que esta explicación te ayude a entender mejor por qué se utiliza RuntimeException en este caso. ¡Espero haber ayudado y buenos estudios!