Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Faça como eu fiz: lidando com exceptions

Segue a resolução do exercício.
Classe TituloOmdb:

package br.com.alura.screenmatch.modelos;

public record TituloOmdb(String title, String year, String runtime) {
}

Classe Titulo:

package br.com.alura.screenmatch.modelos;

import br.com.alura.screenmatch.calculos.Classificavel;
import br.com.alura.screenmatch.excecao.ErroDeConversaoDeAPIException;

public class Titulo implements Comparable<Titulo>{
//Apresentada somente a parte necessária para o tratamento da exceção.
...
    public Titulo(TituloOmdb tituloOmdb) {
        this.nome = tituloOmdb.title();
        if (tituloOmdb.year().length() > 4  || tituloOmdb.year().equals("N/A")) {
            throw new ErroDeConversaoDeAPIException("Data inconsistente ou não disponível");
        } else {
            this.anoDeLancamento = Integer.parseInt(tituloOmdb.year());
        }
        if (tituloOmdb.runtime().equals("N/A")) {
            throw new ErroDeConversaoDeAPIException("Duração não disponível");
        } else {
            this.anoDeLancamento = Integer.parseInt(tituloOmdb.runtime().replaceAll("[^0-9]", ""));
        }
    }
...
}

Classe ErroDeConversaoDeAPIException:

package br.com.alura.screenmatch.excecao;

public class ErroDeConversaoDeAPIException extends RuntimeException{
    private String mensagem;
    public ErroDeConversaoDeAPIException(String mensagem){
        this.mensagem = mensagem;
    }
    @Override
    public String getMessage() {
        return this.mensagem;
    }
}

Classe PrincipalComBusca:

package br.com.alura.screenmatch.principal;

import br.com.alura.screenmatch.excecao.ErroDeConversaoDeAPIException;
import br.com.alura.screenmatch.modelos.ConsultaAPI;
import br.com.alura.screenmatch.modelos.Titulo;
import br.com.alura.screenmatch.modelos.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;


public class PrincipalComBusca {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner sc = new Scanner(System.in);
        System.out.println("Digite o nome do filme: ");
        String nomeFilme = sc.nextLine();
        String nomeFilmeCodificado = URLEncoder.encode(nomeFilme, StandardCharsets.UTF_8);

        String OMDB_API_KEY = "api_key";
        String url = "https://www.omdbapi.com/?t=" + nomeFilmeCodificado + "&apikey=" + OMDB_API_KEY;


        ConsultaAPI consulta = new ConsultaAPI();
        String json = consulta.consultaAPI(url);
        System.out.println("Json de retorno da API: " + json);

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

        TituloOmdb tituloOmdb = gson.fromJson(json, TituloOmdb.class);
        System.out.println("TítuloOmdb: " + tituloOmdb);

        try {
            Titulo meuTitulo = new Titulo(tituloOmdb);
            System.out.println("Título convertido: " + meuTitulo);
        } catch (ErroDeConversaoDeAPIException e) {
            System.out.println("Houve um erro!");
            System.out.println(e.getMessage());
        }
        sc.close();
    }
}

Output:

Json de retorno da API: {"Title":"Divertidamente","Year":"2018–","Rated":"N/A","Released":"11 Mar 2018",...,"Response":"True"}
TítuloOmdb: TituloOmdb[title=Divertidamente, year=2018–, runtime=N/A]
Houve um erro!
Data inconsistente ou não disponível

Process finished with exit code 0
2 respostas
solução!

Oi, Raoni! Como vai?

Gostei do cuidado em validar valores vindos da API antes da conversão, usando uma exceção personalizada para deixar claro quando os dados estão inconsistentes. Isso deixa o fluxo mais seguro e facilita o entendimento do erro no try/catch, principalmente quando a API retorna valores como N/A.

Uma dica interessante para o futuro é usar try/catch diretamente na conversão para evitar falhas inesperadas ao transformar texto em número. Veja este exemplo:


try {
    int ano = Integer.parseInt(valorAno);
    System.out.println(ano);
} catch (NumberFormatException e) {
    System.out.println("Ano invalido");
}

Esse código tenta converter o texto para número e, se falhar, trata o erro sem interromper a execução do programa.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Obrigado pela dica! Vou utilizar essa forma nas próximas soluções.