1
resposta

BuscaCEP Brasil — Localizador de Endereços (Projeto final do curso consultas api)

**MAIN **

import java.util.Scanner;

public class BuscarEndereco {

public static void main(String[] args) {

    Scanner ler = new Scanner(System.in);

    try {
        System.out.println("Olá, bem vindo!");
        System.out.println("===== SISTEMA DE CONSULTA DE CEP =====");
        System.out.print("Favor informe um CEP válido para consulta: ");
        String cep = ler.next().replaceAll("[^0-9]", "");

        if (cep.length() != 8) {
            throw new IllegalArgumentException("CEP deve conter 8 numeros validos.");
        }

        ConsultaCep consultaCep = new ConsultaCep();
        Endereco endereco = consultaCep.buscar(cep);

        System.out.println("\nPara o CEP informado " + cep + ", segue o endereço:");
        System.out.println(endereco);
            GeradorDeArquivo gerador = new GeradorDeArquivo();
            gerador.salvaJson(endereco);
    } catch (Exception e) {
        System.out.println("Erro: " + e.getMessage());
    }
}

}

**Record **

public record Endereco(
String cep,
String logradouro,
String complemento,
String bairro,
String localidade,
String uf,
String ddd
) {
@Override
public String toString() {
return "\n==========================================\n" +
"CEP: " + cep + "\n" +
"Logradouro: " + logradouro + "\n" +
"Complemento: " + (complemento == null || complemento.isEmpty() ? "nullo" : complemento) + "\n" +
"Bairro: " + bairro + "\n" +
"Cidade: " + localidade + "\n" +
"UF: " + uf + "\n" +
"DDD: " + ddd +
"\n==========================================";
}
}

HTTP/GSON

import com.google.gson.Gson;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ConsultaCep {

    private final String URL_BASE = "https://viacep.com.br/ws/";

    public Endereco buscar(String cep) throws Exception {

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(URL_BASE + cep + "/json/"))
                .build();

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

        if (response.statusCode() != 200) {
            throw new IllegalArgumentException("Serviço indisponível. Tente novamente mais tarde.");
        }

        if (response.body().contains("\"erro\"")) {
            throw new IllegalArgumentException("CEP não encontrado.");
        }

        Gson gson = new Gson();
        return gson.fromJson(response.body(), Endereco.class);
    }
}

GeradorDeArquivo

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;

public class GeradorDeArquivo {

public void salvaJson (Endereco endereco) throws IOException {

    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    FileWriter escrita = new FileWriter(endereco.cep() + ".json");
    escrita.write(gson.toJson(endereco));
    escrita.close();

}

}

1 resposta

Olá, Marlon. Como vai?

Parabéns pela conclusão do projeto! Ficou evidente que você conseguiu consolidar muito bem os pilares do curso: consumo de API, manipulação de arquivos e tratamento de exceções. O uso de Records para representar o endereço é uma excelente prática, pois torna o código mais conciso e garante a imutabilidade dos dados, algo muito valorizado no desenvolvimento Java moderno.

Gostaria de destacar alguns pontos técnicos positivos na sua solução e oferecer sugestões que podem elevar ainda mais a qualidade do seu código:

  • Sanitização de Dados: O uso de replaceAll("[^0-9]", "") para limpar a entrada do usuário é uma estratégia muito robusta. Isso evita que o programa falhe caso o usuário digite o CEP com traços ou espaços.
  • Tratamento da API: No ViaCEP, um detalhe importante é que ele retorna o status code 200 mesmo quando o CEP não é encontrado, enviando um campo "erro": true no corpo do JSON. Você tratou isso corretamente com o método contains, garantindo que sua aplicação não tente converter um erro em um objeto de endereço válido.
  • GSON e PrettyPrinting: Utilizar o setPrettyPrinting() no GeradorDeArquivo é uma ótima escolha para tornar o arquivo JSON legível para seres humanos.

Para agregar ainda mais valor ao seu projeto, deixo duas sugestões de boas práticas:

1. Uso de Try-with-resources
No seu GeradorDeArquivo, você está fechando o FileWriter manualmente com escrita.close(). No Java, a recomendação é utilizar o try-with-resources. Isso garante que o recurso (o arquivo) seja fechado automaticamente pelo sistema, mesmo se ocorrer um erro durante a escrita, evitando vazamentos de memória (memory leaks).

Veja como o código ficaria:

public void salvaJson(Endereco endereco) throws IOException {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    
    try (FileWriter escrita = new FileWriter(endereco.cep() + ".json")) {
        escrita.write(gson.toJson(endereco));
    }
}

2. Refinamento de Exceções
Atualmente, você está capturando uma exceção genérica Exception no seu main. Conforme você avançar nos estudos, verá que é interessante capturar exceções específicas (como IOException ou InterruptedException) para dar feedbacks mais precisos ao usuário. Por exemplo, você poderia informar se o problema foi especificamente na conexão com a internet ou na permissão de gravação do arquivo no disco.

3. Verificação de Nulos
No seu método toString(), você fez uma validação manual para o campo complemento. Isso é excelente para a experiência do usuário. Em projetos maiores, você também pode explorar a anotação @SerializedName do GSON caso os campos da API tivessem nomes diferentes dos seus atributos no Record.

Continue com essa ótima organização modular, separando as responsabilidades entre consulta e geração de arquivos, pois essa é a base para sistemas escaláveis e de fácil manutenção.

Espero que possa ter lhe ajudado!