Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.