1
resposta

Lidando com exceptions

Classe ErroException:

package screenmatch.modelos;

public class ErroDeConversaoException extends RuntimeException {
    private String mensagemErro;
    public ErroDeConversaoException(String mensagemErro) {
        this.mensagemErro = mensagemErro;
    }

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

Pequena alteração no construtor:

public Tipo(DadosOmdb dadosOmdb){
        this.nome = dadosOmdb.title();
        if(dadosOmdb.year().length() > 4){
            throw new ErroDeConversaoException("Não foi possível converter o ano de lançamento, por ter mais de 4 caracteres!");
        }
        this.anoLancamento = Integer.valueOf(dadosOmdb.year());
    }

Tratamento de exceptions no main:

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

        String json = response.body();
        System.out.println(json);

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

        DadosOmdb dadosMidias = gson.fromJson(json, DadosOmdb.class);
        System.out.println(dadosMidias);
        Tipo meuTipo = new Tipo(dadosMidias);
        
            System.out.println("--------------------");
            System.out.println("Conversão de título: ");
            System.out.println(meuTipo);
        } catch(NumberFormatException e) {
            System.out.println("Erro, de formato de número");
            System.out.println(e.getMessage());
        } catch(IllegalArgumentException e){
            System.out.println("Erro de argumento, verifique o nome do filme");
        } catch(ErroDeConversaoException e){
            System.out.println(e.getMessage());
        }

Consegui mostrar no console as mensagens de erro corretamente para os erros, até consegui criar semelhante ao exemplo, um erro para caso o nome não seja encontrado nas busca dessa forma:

Nova Exception:

package screenmatch.modelos;

public class NomeInvalidoException extends RuntimeException {
    private String mensagemErro;
    public NomeInvalidoException(String mensagemErro) {
        this.mensagemErro = mensagemErro;
    }

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

E o trecho que mexi no construtor:

public Tipo(DadosOmdb dadosOmdb){
        if (dadosOmdb.title()==null){
            throw new NomeInvalidoException("Nome do filme/Série inválido, não foi possível encontrar!!!");
        }
        this.nome = dadosOmdb.title();

Console:

Digite o nome do filme: 
NomeInvalido
{"Response":"False","Error":"Movie not found!"}
DadosOmdb[title=null, year=null]
Nome do filme/Série inválido, não foi possível encontrar!!!
Programa finalizado!

Adicionei essa nova exception num útlimo catch no main.

1 resposta

Oi, Paulo! Como vai?

Obrigada por compartilhar seu código com a comunidade Alura.

Ficou excelente a forma como você implementou o tratamento de exceções personalizadas, criando as classes ErroDeConversaoException e NomeInvalidoException. Isso deixa seu código muito mais robusto e claro para quem for ler ou manter no futuro.

Conteúdos relacionados
Alura

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