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

[Dúvida] Meu código só imprime o "sair" no meu JSON

Olá, tudo bem?

Estou com um problema na parte de colocar o filme, imagino que seja dentro do loop.

Quando eu escrevo um filme no console, durante a execução do programa, a cada filme que eu digito, ele não imprime e nem me retorna nada.

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

Porém quando eu coloco para "sair", ai sim ele imprime e ainda envia para o meu arquivo JSON

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade O meu código está da seguinte maneira:

package br.com.douglas.screenmatch.principal;

import br.com.douglas.screenmatch.exception.ErrorDeConversaoDeAnoException;
import br.com.douglas.screenmatch.model.Filme;
import br.com.douglas.screenmatch.model.Titulo;
import br.com.douglas.screenmatch.model.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

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.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MainSearch {
    public static void main(String[] args) throws IOException, InterruptedException {

        Scanner leitura = new Scanner(System.in);
        String busca = " ";

        List<Titulo> titulos = new ArrayList<>();

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();


        while (!busca.equalsIgnoreCase("sair")) {

            System.out.println("Digite o filme para busca: ");
            busca = leitura.nextLine();

            if (busca.equalsIgnoreCase("sair")) {
                break;
            }
        }

        String endereco = "https://www.omdbapi.com/?t=" + busca.replace(" ", "+") + "&apikey=c8d6fc05";

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

            String json = response.body();
            System.out.println(json);

            TituloOmdb meuTituloOmdb = gson.fromJson(json, TituloOmdb.class);
            System.out.println(meuTituloOmdb);


            Titulo meuTitulo = new Titulo(meuTituloOmdb);
            System.out.println("Título já Convertido");
            System.out.println(meuTitulo);

            titulos.add(meuTitulo);

        } catch (NumberFormatException e) {
            System.out.println("Aconteceu um erro: ");
            System.out.println(e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("Algum erro de argumento na busca, verifique o endereço");
        } catch (ErrorDeConversaoDeAnoException e) {
            System.out.println(e.getMessage());
        }

        System.out.println(titulos);

        FileWriter escrita = new FileWriter("filmes.json");
        escrita.write(gson.toJson(titulos));
        escrita.close();

        System.out.println("O programa finalizou corretamente!");
    }
    }

Onde que está o erro?

Obrigado!!!

2 respostas
solução!

Oi Douglas,

Isso está acontecendo porque o código que faz todo esse processo da chamada à API, impressão da resposta Json e a escrita no arquivo só roda depois que você sair do looping do seu WHILE.

Veja só... Esse trecho aqui vai ficar num loop infinito pedindo pro usuário inserir o nome do filme para a busca:

        while (!busca.equalsIgnoreCase("sair")) {

            System.out.println("Digite o filme para busca: ");
            busca = leitura.nextLine();

            if (busca.equalsIgnoreCase("sair")) {
                break;
            }
        }

A linhas a seguir só serão executadas quando o usuário inserir o comando para sair do WHILE, no caso, o comando "sair".

Imagino que o que você gostaria de fazer era buscar o filme, imprimir a resposta, transformar num Objeto Titulo, adicionar esse objeto a coleção titulos e depois disso repetir o processo infinitamente até o usuário inserir o "sair"; após inserir o comando sair, converter a coleção titulos em Json e gravar esse Json em um arquivo de texto. Então, o correto seria assim:

    while (!busca.equalsIgnoreCase("sair")) {

        System.out.println("Digite o filme para busca: ");
        busca = leitura.nextLine();

        // Finaliza a execução do while se o usuário digitar o comando "sair"
        if (busca.equalsIgnoreCase("sair")) {
            break;
        }


        // Todo o código a seguir faz a chamada a API, transforma a resposta em um objeto Titulo e adiciona o objeto a coleção `titulos`
        
        String endereco = "https://www.omdbapi.com/?t=" + busca.replace(" ", "+") + "&apikey=c8d6fc05";

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

            String json = response.body();
            System.out.println(json);

            TituloOmdb meuTituloOmdb = gson.fromJson(json, TituloOmdb.class);
            System.out.println(meuTituloOmdb);


            Titulo meuTitulo = new Titulo(meuTituloOmdb);
            System.out.println("Título já Convertido");
            System.out.println(meuTitulo);

            titulos.add(meuTitulo);

        } catch (NumberFormatException e) {
            System.out.println("Aconteceu um erro: ");
            System.out.println(e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("Algum erro de argumento na busca, verifique o endereço");
        } catch (ErrorDeConversaoDeAnoException e) {
            System.out.println(e.getMessage());
        }			
    }
    
    // Imprime a coleção `titulos`
    System.out.println(titulos);

    // Escreve os dados da coleção `titulos` no arquivo em formato Json
    FileWriter escrita = new FileWriter("filmes.json");
    escrita.write(gson.toJson(titulos));
    escrita.close();

    // Imprime a mensagem de feedback para o usuário entender que o programa parou de executar
    System.out.println("O programa finalizou corretamente!");
    
    }

O ciclo de vida do seu código atualmente é o seguinte:

  • Inicia um loop while

  • Dentro do loop, solicita que o usuário dê um input

  • Captura o input do usuário e guarda esse valor na variável busca

  • Verifica se o valor do input é igual ao comando "sair"

  • Repete tudo de novo até o usuário inserir o comando "sair"

  • Ao receber o comando sair, quebra a execução do loop while

  • Faz a chamada a API

  • Transforma a resposta em um objeto Titulo e adiciona esse objeto a coleção titulos

  • Transforma a coleção titulos em Json e escreve num arquivo de texto

  • Termina a execução

O ciclo de vida correto seria:

  • Inicia um loop while

  • Dentro do loop, solicita que o usuário dê um input

  • Captura o input do usuário e guarda esse valor na variável busca

  • Verifica se o valor do input é igual ao comando "sair"

  • Faz a chamada a API

  • Transforma a resposta em um objeto Titulo e adiciona esse objeto a coleção titulos

  • Repete tudo de novo até o usuário inserir o comando "sair"

  • Ao receber o comando sair, quebra a execução do loop while

  • Transforma a coleção titulos em Json e escreve num arquivo de texto

  • Termina a execução

Espero que tenha te ajudado o/

Se funcionou, não esquece de marcar essa resposta com a solução. Bons estudos!

Opa Mateus,

Era isso mesmo kkkkk

Valeu, resolveu o meu problema e obrigado por ter deixado a solução bem explicada, e ajudar a melhorar o meu código!