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

[Dúvida] Melhorar o código.

package br.com.desafiobuscarporcep.principal;

import br.com.desafiobuscarporcep.consulta.ConsultaCep;
import br.com.desafiobuscarporcep.geradorarquivo.GeradorDeArquivo;
import br.com.desafiobuscarporcep.record.Endereco;

import java.io.IOException;
import java.util.Scanner;

public class Principal {
    public static void main(String[] args) {

        Scanner teclado = new Scanner(System.in);
        ConsultaCep consultaCep = new ConsultaCep();


        String cep = "";


        while(!cep.equalsIgnoreCase("s")) {

            System.out.println("Digite CEP para consulta, ou alguma letra para sair.");
            cep = teclado.nextLine();




            try {

                if(!cep.matches("[0-9]*")){
                    break;
                }



                Endereco novoEndereco = consultaCep.buscaCep(cep);

                if(novoEndereco.cep() == null)
                    System.out.println("Cep não cadastrado!!!");

                System.out.println(novoEndereco);


                GeradorDeArquivo gerador = new GeradorDeArquivo();
                gerador.salvaJson(novoEndereco);


            } catch (RuntimeException | IOException e) {
                System.out.println(e.getMessage());

            } finally {
                System.out.println("Finalizando a aplicação!!!\n");
            }
        }




    }
}

import br.com.desafiobuscarporcep.record.Endereco;
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 {



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


            FileWriter escrita = new FileWriter(endereco.cep() + ".json");
            escrita.write(gson.toJson(endereco));
            escrita.close();
        } catch (IOException e){
            System.out.println("Erro ao gerar arquivo!! " + e.getMessage());
        }
    }
}


import br.com.desafiobuscarporcep.record.Endereco;
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 {

    public Endereco buscaCep(String cep){
        URI endereco = URI.create("https://viacep.com.br/ws/" + cep + "/json");


        HttpRequest request = HttpRequest.newBuilder()
                .uri(endereco)
                .build();




        try {


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



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




        } catch (Exception e) {
            throw new RuntimeException("Cep sem endereço!!!!");
        }





    }

}

package br.com.desafiobuscarporcep.record;

public record Endereco(String cep,
                       String logradouro,
                       String localidade,
                       String uf) {



    @Override
    public String toString() {
        return "Endereco ( " +
                "cep = " + cep +
                ", logradouro = " + logradouro  +
                ", localidade = " + localidade +
                ", uf = " + uf + " )";
    }
}

Boa noite! Gostaria de melhorar o código porém , preciso de uma ajuda. Na classe Principal consegui veificar se o novoEndereco é null, mas infelizmente consegui fazer somente o programa parar. Muito "Feio" gerar um arquivo null. Claro se tiver mais algum conselho, ajuda, será bem vinda. Obrigado.

10 respostas

Olá Alerson, tudo bem?

Para evitar que o programa gere um arquivo nulo, você pode adicionar uma verificação antes de chamar o método gerador.salvaJson(novoEndereco). Você pode alterar o trecho de código que verifica se o CEP é nulo para verificar se o objeto novoEndereco é nulo. Caso seja nulo, você pode exibir uma mensagem informando que o CEP não foi encontrado e não chamar o método gerador.salvaJson(novoEndereco).

Segue abaixo uma sugestão de como ficaria o trecho de código:

if(novoEndereco == null) {
    System.out.println("Cep não cadastrado!!!");
} else {
    System.out.println(novoEndereco);
    GeradorDeArquivo gerador = new GeradorDeArquivo();
    gerador.salvaJson(novoEndereco);
}

Espero ter ajudado e bons estudos!

Boa tarde, Matheus Brandino. Muito obrigado pela ajuda. Infelizmente não funcionou Insira aqui a descrição dessa imagem para ajudar na acessibilidade

novoEndereco recebendo null em todos os campos, ainda da false

Mas com sua ajuda consegui resolver, não sei se é aceitavelInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Pedindo para verifcar se (novoEndereco.cep() == null). Pergunta porque tive que verificar o atributo do record e não o objeto novoEndereco? E outra pergunta conseguiria fazer essa verificação no método buscaCep? Assim que receber o HttpResponse response? Obrigado.

vc consegue ver se está recebendo o json de resposta ? pode ser um print dessa linha: response.body()

Seria isto

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

isso, mas no caso queria ver apenas o resultado do response.body() e não do Gson

Matheus, resultado do response.body(), seria este,senão poderia me ajudar a mostrá-lo, obrigado pela paciência.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Fala Alerson,

Cara encontramos o problema, quando vc esta fazendo essa request ela está dando erro.

Provavelmente o cep que vc está passando é inválido.. tente passar outro, por exemplo 04101-300, que é o cep da alura.

Sim,é isso mesmo. E conseguiria, (ou como) fazer essa verificação no método buscaCep? Assim que receber o HttpResponse response? Obrigado.

solução!

No caso voce esta fazendo isso, como a api está devolvendo certinho, a response vem diferente do que tu espera, o que tu poderia fazer é mapear esse erro e validar se ele existe ou não... por ser um boolean tu pode setar pra false por padrão e nesse cenário ele vai criar como true e tu consegue tratar.

public record Endereco(String cep,
                       String logradouro,
                       String localidade,
                       String uf,
                       boolean erro) 
                       
                       
if(novoEndereco == null && novoEndereco.hasErro()) {
    System.out.println("Cep não cadastrado!!!");
} else {
    System.out.println(novoEndereco);
    GeradorDeArquivo gerador = new GeradorDeArquivo();
    gerador.salvaJson(novoEndereco);
}

Showw. Entendi. Funcionou perfeitamente, ele é criado como true e entra no laço. Matheus, muito obrigado pela paciência e ajuda, abraço.