Aquí tienes el código completo, con los cambios solicitados y las explicaciones correspondientes:
- Creación de la clase ErrorEnConversionDeDuracionException:
public Titulo(TituloOmdb miTituloOmdb) { this.nombre = miTituloOmdb.title(); this.fechaDeLanzamiento = Integer.valueOf(miTituloOmdb.year());
// Validación de la duración
if (miTituloOmdb.runtime().contains("N/A")) {
throw new ErrorEnConversionDeDuracionException("No pude convertir la duración, porque contiene un N/A");
}
this.duracionEnMinutos = Integer.valueOf(
miTituloOmdb.runtime().substring(0, 3).replace(" ", "")
);
}
Se verifica si la duración (runtime) contiene "N/A". Si es así, se lanza la excepción personalizada. Si la duración es válida, se extraen los primeros 3 caracteres, se eliminan espacios y se convierte a entero. 3. Manejo de excepciones en la clase PrincipalConBusqueda:
package com.alura.screenmatch.excepcion;
public class ErrorEnConversionDeDuracionException extends RuntimeException { private String mensaje;
public ErrorEnConversionDeDuracionException(String mensaje) {
this.mensaje = mensaje;
}
@Override
public String getMessage() {
return this.mensaje;
}
}
Esta clase extiende RuntimeException, lo que significa que no es necesario declararla explícitamente en la firma del método (usando throws). Almacena un mensaje de error personalizado que se puede recuperar con getMessage(). 2. Modificación del constructor de la clase Titulo:
public Titulo(TituloOmdb miTituloOmdb) { this.nombre = miTituloOmdb.title(); this.fechaDeLanzamiento = Integer.valueOf(miTituloOmdb.year());
// Validación de la duración
if (miTituloOmdb.runtime().contains("N/A")) {
throw new ErrorEnConversionDeDuracionException("No pude convertir la duración, porque contiene un N/A");
}
this.duracionEnMinutos = Integer.valueOf(
miTituloOmdb.runtime().substring(0, 3).replace(" ", "")
);
}
Se verifica si la duración (runtime) contiene "N/A". Si es así, se lanza la excepción personalizada. Si la duración es válida, se extraen los primeros 3 caracteres, se eliminan espacios y se convierte a entero. 3. Manejo de excepciones en la clase PrincipalConBusqueda:
public class PrincipalConBusqueda { public static void main(String[] args) throws IOException, InterruptedException { // ... (código para obtener la búsqueda del usuario)
try {
// ... (código para realizar la solicitud HTTP y obtener el JSON)
// Conversión de JSON a objeto
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.create();
TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
// Creación del objeto Titulo (puede lanzar la excepción personalizada)
Titulo miTitulo = new Titulo(miTituloOmdb);
System.out.println("Titulo ya convertido: " + miTitulo);
} catch (NumberFormatException e) {
System.out.println("Ocurrió un error al convertir un número: ");
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println("Error en la URI, verifique la dirección.");
} catch (ErrorEnConversionDeDuracionException e) {
System.out.println(e.getMessage()); // Imprime el mensaje personalizado
} finally {
System.out.println("Finalizó la ejecución del programa!");
}
}
}
Se agregaron bloques catch para manejar: NumberFormatException: Si hay problemas al convertir cadenas a números. IllegalArgumentException: Si la URI de la solicitud es inválida. ErrorEnConversionDeDuracionException: Si la duración del título no se puede convertir. Se utiliza un bloque finally para garantizar que el mensaje "Finalizó la ejecución del programa!" se imprima siempre, incluso si ocurre una excepción. Puntos clave:
Ahora el programa es más robusto al manejar errores específicos relacionados con la conversión de datos de la API. La excepción personalizada proporciona un mensaje claro sobre el problema de conversión de duración. El bloque finally asegura una salida limpia incluso en caso de errores.