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

Haga lo que hicimos en aula

Primero, nos aseguramos de que la carpeta src tenga la estructura de carpetas com/alura/screenmatch/excepcion. Dentro, creamos el archivo:
ErrorEnConversionDeDuracionException.java:

package com.alura.screenmatch.excepcion;

// Heredamos de RuntimeException para que sea una excepción que no obligue 
// a usar try-catch en todos lados, pero que podamos capturar si queremos.
public class ErrorEnConversionDeDuracionException extends RuntimeException {
    private String mensaje;

    public ErrorEnConversionDeDuracionException(String mensaje) {
        this.mensaje = mensaje;
    }

    @Override
    public String getMessage() {
        return this.mensaje;
    }
}

En la clase Titulo, modificamos el constructor que recibe el TituloOmdb:

// Dentro de la clase Titulo.java
public Titulo(TituloOmdb miTituloOmdb) {
   this.nombre = miTituloOmdb.title();
   
   // Validación de la fecha
   this.fechaDeLanzamiento = Integer.valueOf(miTituloOmdb.year());
   
   // Validación de la duración: OMDb a veces envía "N/A" si no conoce el dato
   if (miTituloOmdb.runtime().contains("N/A")) {
       throw new ErrorEnConversionDeDuracionException("No pude convertir la duración porque contiene un N/A");
   }
   
   // Si no es N/A, limpiamos el texto (ejemplo: "120 min" -> "120") y convertimos a int
   this.duracionEnMinutos = Integer.valueOf(
           miTituloOmdb.runtime().substring(0, 3).replace(" ", "")
   );
}

Ahora, integramos todo en la clase principal:

public class PrincipalConBusqueda {
   public static void main(String[] args) throws IOException, InterruptedException {
       Scanner lectura = new Scanner(System.in);
       System.out.println("Escriba el nombre de una película: ");
       var busqueda = lectura.nextLine();

       // Usamos tu clave: a9f38ea0 y reemplazamos espacios por "+"
       String direccion = "https://www.omdbapi.com/?t=" + 
               busqueda.replace(" ", "+") + 
               "&apikey=a9f38ea0";

       try {
           HttpClient client = HttpClient.newHttpClient();
           HttpRequest request = HttpRequest.newBuilder()
                   .uri(URI.create(direccion))
                   .build();
           HttpResponse<String> response = client
                   .send(request, HttpResponse.BodyHandlers.ofString());

           String json = response.body();
           System.out.println("JSON recibido: " + json);

           Gson gson = new GsonBuilder()
                   .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                   .create();

           TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
           
           Titulo miTitulo = new Titulo(miTituloOmdb);
           System.out.println("Título ya convertido: " + miTitulo);

       } catch (NumberFormatException e) {
           System.out.println("Ocurrió un error de formato numérico: " + e.getMessage());
       } catch (IllegalArgumentException e) {
           System.out.println("Error en la URI, verifique la dirección.");
       } catch (ErrorEnConversionDeDuracionException e) {
           // Aquí capturamos nuestra propia excepción personalizada
           System.out.println(e.getMessage());
       } catch (Exception e) {
           // Catch genérico al final por si ocurre algo inesperado
           System.out.println("Ocurrió un error inesperado.");
       }

       System.out.println("¡Finalizó la ejecución del programa!");
   }
}
1 respuesta

¡Hola Mario, espero que estés bien!

Parece que estás siguiendo un ejercicio para manejar errores al consumir una API y has implementado una excepción personalizada para manejar casos específicos. Tu implementación parece estar bastante alineada con lo que se espera en la actividad. Sin embargo, aquí hay algunos puntos que podrías revisar o ajustar:

  1. Verificación de Substring: En tu método Titulo, cuando verificas la duración, estás usando miTituloOmdb.runtime().substring(0, 3). Asegúrate de que la cadena tenga al menos 3 caracteres antes de llamar a substring, para evitar un StringIndexOutOfBoundsException.

    if (miTituloOmdb.runtime().length() >= 3) {
        this.duracionEnMinutos = Integer.valueOf(
            miTituloOmdb.runtime().substring(0, 3).replace(" ", "")
        );
    } else {
        throw new ErrorEnConversionDeDuracionException("Duración inválida.");
    }
    
  2. Manejo de Errores: Ya estás manejando varias excepciones, lo cual es excelente. Asegúrate de que el catch genérico al final capture cualquier otra excepción inesperada.

  3. API Key: Veo que estás usando una clave de API en tu código. Asegúrate de que esta clave sea válida y de que no la compartas públicamente si es privada.

  4. Pruebas: Intenta probar tu código con diferentes entradas, especialmente aquellas que podrían causar errores, como títulos de películas que no existen o duraciones que no son números.

  5. Mensajes de Error: Los mensajes de error son claros, lo cual es muy útil para depurar. Considera también registrar estos errores en un archivo de log para un análisis posterior.

Espero que estas sugerencias te sean útiles. ¡Bons estudios!