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

Dúvida exercício 3

O meu código ficou assim:

public class ConsultaGitHub {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Digite o nome do usuário que deseja encontrar.");
        String nomeUsuario = scanner.nextLine();

        String endereco = "https://api.github.com/users/" + nomeUsuario;

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

            if (response.statusCode() == 404) {
                throw new ErrorSearchGitHubException("Usuário não localizado.");
            }
            
            System.out.println(response.body());

            Gson gson = new Gson();
            GitHubApi gitHubApi = gson.fromJson(response.body(), GitHubApi.class);
            System.out.println(gitHubApi);

        } catch (IOException | InterruptedException e) {
            System.out.println("Erro ao processar a solicitação: " + e.getMessage());
        } catch (ErrorSearchGitHubException e) {
            System.out.println(e.getMessage());
        }
    }
}
public record GitHubApi(String login, String bio) {
}
public class ErrorSearchGitHubException extends RuntimeException {
    public ErrorSearchGitHubException(String mensagem) {
        super(mensagem);
    }
}

O código funciona corretamente, mas percebi que, ao comentar a linha System.out.println(response.body()); para não mostrar o Json, quando insere o usuário invalido não caí no bloco catch, aí invés disso retorna o json formatado com os campos Null.Obs: quando o usuário é válido, ele retorna corretamente.

Exempo do erro que está acontecendo

Por que e como resolver isso? Grato!

4 respostas

Olá, Klaus! Acho que o problema ocorre porque a linha:

if (response.statusCode() == 404)

só verifica o código HTTP da resposta. Quando você comenta o System.out.println(response.body());, você remove uma pista visual, mas o comportamento ainda depende de response.statusCode(). Se você não verificar o statusCode antes de chamar o fromJson, o Gson tenta fazer o parse mesmo assim, mas como os campos login e bio não existem nesse JSON, eles acabam ficando null.

GitHubApi[name=null, bio=null]

Como resolver? Tente verificar o statusCode antes de tentar converter o JSON com o Gson, como você já tentou fazer — mas não remova essa verificação, pois ela é fundamental.

HttpResponse<String> response = client
        .send(request, HttpResponse.BodyHandlers.ofString());

if (response.statusCode() == 404) {
    throw new ErrorSearchGitHubException("Usuário não localizado.");
} else if (response.statusCode() != 200) {
    throw new ErrorSearchGitHubException("Erro ao consultar usuário: " + response.statusCode());
}

// Somente faz o parse se status for 200 (OK)
Gson gson = new Gson();
GitHubApi gitHubApi = gson.fromJson(response.body(), GitHubApi.class);
System.out.println(gitHubApi);

Agora a decisão de parse só é feita se o código for 200 (OK). Espero que vai funcionar!

Bom dia,

continua retornando os campos null

Digite o nome do usuário que deseja encontrar. cccccc GitHubApi[name=null, bio=null]

solução!

Consegui resolver da seguinte forma:

if (response.statusCode() == 404 || response.statusCode() != 200) {
      throw new ErrorSearchGitHubException("Usuário não localizado.");
}

Grato pela ajuda!