2
respostas

Resolução do Desafio

1. Arquivo: Localidade.java

// Localidade.java
import com.google.gson.annotations.SerializedName;

public class Localidade {
    private String cep;
    private String logradouro;
    private String complemento;
    private String bairro;
    private String localidade; // Este campo é a cidade
    private String uf;
    private String ibge;
    private String gia;
    private String ddd;
    private String siafi;
    @SerializedName("erro") // Mapeia o campo 'erro' da API para um booleano em Java
    private boolean erro;

    // Construtor (opcional, Gson pode instanciar via reflexão)
    // Se não tiver construtor, pode remover esta seção
    public Localidade(String cep, String logradouro, String complemento, String bairro, String localidade, String uf, String ibge, String gia, String ddd, String siafi, boolean erro) {
        this.cep = cep;
        this.logradouro = logradouro;
        this.complemento = complemento;
        this.bairro = bairro;
        this.localidade = localidade;
        this.uf = uf;
        this.ibge = ibge;
        this.gia = gia;
        this.ddd = ddd;
        this.siafi = siafi;
        this.erro = erro;
    }

    // Getters
    public String getCep() { return cep; }
    public String getLogradouro() { return logradouro; }
    public String getComplemento() { return complemento; }
    public String getBairro() { return bairro; }
    public String getLocalidade() { return localidade; }
    public String getUf() { return uf; }
    public String getIbge() { return ibge; }
    public String getGia() { return gia; }
    public String getDdd() { return ddd; }
    public String getSiafi() { return siafi; }
    public boolean isErro() { return erro; } // Getter para o campo de erro

    @Override
    public String toString() {
        if (erro) {
            return "CEP não encontrado ou inválido.";
        }
        return "CEP: " + cep +
                ", Logradouro: " + logradouro +
                ", Bairro: " + bairro +
                ", Cidade: " + localidade +
                ", UF: " + uf;
    }
}
2 respostas

2. Arquivo: ConsultandoCEP.java

// ConsultandoCEP.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException; // Importar para tratar erros de sintaxe JSON
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Scanner;

public class ConsultandoCEP {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        String consulta = "";

        // Correção: Removido setFieldNamingPolicy, pois os nomes das propriedades
        // da classe Localidade já correspondem aos do JSON do ViaCEP (camelCase).
        // Se houvesse snake_case no JSON e camelCase na classe, usaríamos @SerializedName.
        Gson gson = new GsonBuilder()
                .setPrettyPrinting() // Mantém o pretty printing para o JSON de saída, se você o usasse.
                .create();

        while (true) { // Loop infinito, quebra no "sair" ou erro
            System.out.println("Digite o CEP que deseja consultar (somente números) ou 'sair' para encerrar: ");
            consulta = leitura.nextLine().trim(); // Trim para remover espaços em branco

            if (consulta.equalsIgnoreCase("sair")) {
                System.out.println("Encerrando o programa...");
                break; // Sai do loop
            }

            // Opcional: Validação básica do formato do CEP (8 dígitos)
            if (!consulta.matches("\\d{8}")) {
                System.out.println("Formato de CEP inválido. Digite 8 dígitos numéricos.");
                continue; // Pula para a próxima iteração do loop
            }

            String url = "https://viacep.com.br/ws/" + consulta + "/json/";

            try {
                HttpClient client = HttpClient.newHttpClient();
                HttpRequest request = HttpRequest.newBuilder()
                        .uri(URI.create(url))
                        .build();

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

                String json = response.body();

                // Tratamento para JSON malformado ou erro da API
                if (json.contains("\"erro\": true")) {
                    System.out.println("CEP não encontrado ou inválido.");
                    continue; // Pula para a próxima iteração
                }

                // Deserializa o JSON para um objeto Localidade
                Localidade minhaLocalidade = gson.fromJson(json, Localidade.class);

                System.out.println("\n--- Detalhes da Localidade ---");
                System.out.println(minhaLocalidade); // Chama o toString() da Localidade
                System.out.println("-----------------------------\n");

                // Gravação no arquivo usando try-with-resources
                // O 'true' no FileWriter permite adicionar ao final do arquivo (append)
                try (BufferedWriter escrita = new BufferedWriter(new FileWriter("CepsConsultados.txt", true))) {
                    escrita.write(minhaLocalidade.toString());
                    escrita.newLine(); // Adiciona uma nova linha após cada registro
                    System.out.println("Localidade salva no arquivo 'CepsConsultados.txt'.");
                } // escrita é automaticamente fechada aqui

            } catch (JsonSyntaxException e) {
                // Captura erros quando o JSON retornado não pode ser mapeado para Localidade
                System.err.println("Erro na sintaxe JSON ou dados inesperados da API: " + e.getMessage());
                System.err.println("Verifique o CEP digitado e a estrutura do JSON recebido.");
            } catch (IOException | InterruptedException e) {
                // Captura erros de rede ou interrupções
                System.err.println("Ocorreu um erro de comunicação ou interrupção: " + e.getMessage());
                System.err.println("Verifique sua conexão com a internet ou o CEP digitado.");
            } catch (IllegalArgumentException e) {
                // Captura erro se a URI for malformada (URI.create)
                System.err.println("Erro na URL do CEP: " + e.getMessage());
            }
        }

        leitura.close(); // Fecha o Scanner ao sair do loop
        System.out.println("Programa finalizado.");
    }
}

Oii, Daiane!

Obrigada por compartilhar.

Seu código tá muito bem estruturado! Gostei especialmente da forma como você tratou diferentes tipos de exceções e implementou o toString() para apresentar os dados da localidade. Isso mostra um ótimo cuidado com a experiência do usuário e com a organização do código.

Uma dica interessante para o futuro é adicionar uma verificação se o arquivo CepsConsultados.txt já contém aquele CEP, evitando duplicatas. Isso pode ser feito com leitura prévia do arquivo antes de escrever. Um exemplo simplificado:


List<String> linhas = Files.readAllLines(Paths.get("CepsConsultados.txt"));
if (!linhas.contains(minhaLocalidade.toString())) {
    Files.write(Paths.get("CepsConsultados.txt"), minhaLocalidade.toString().getBytes(), StandardOpenOption.APPEND);
}

Isso ajuda a evitar que o mesmo CEP seja gravado várias vezes se o usuário consultá-lo mais de uma vez.

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