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

[Dúvida] modeloLista.modelos().stream() é nulo (desafio tabela FIPE)

já reassisti a aula uma 3 vezes e ainda n achei o erro. Quando eu chego na parte de selecionar a marca do carro o codigo não funciona mais rola o seguinte erro java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because the return value of "br.com.alura.ProjectCars.model.Modelos.modelos()" is null

//principal

package br.com.alura.ProjectCars.principal;

import br.com.alura.ProjectCars.model.Dados; import br.com.alura.ProjectCars.model.Modelos; import br.com.alura.ProjectCars.service.ConsumoApi; import br.com.alura.ProjectCars.service.ConverteDados;

import java.util.Comparator; import java.util.Scanner;

public class Principal {

private Scanner leitura = new Scanner(System.in); private ConsumoApi consumo = new ConsumoApi(); private ConverteDados conversor = new ConverteDados(); private final String URL_BASE = "https://parallelum.com.br/fipe/api/v1";

public void exibeMenu(){
    var menu = """
            *** OPÇÕES ***
            carro
            moto 
            caminhão
            
            
            Digite uma das opções para consultar:  
            """;

    System.out.println(menu);
    var opcao = leitura.next();
     String endereco;

     if(opcao.toLowerCase().contains("carr")){

         endereco = URL_BASE + "/carros/marcas";

     } else if (opcao.toLowerCase().contains("mo")) {

         endereco = URL_BASE + "/motos/marcas";

     }else {
         endereco = URL_BASE + "/caminhoes/marcas";
     }

     var json = consumo.obterDados(endereco);
    System.out.println(json);

    var marcas = conversor.obterLista(json, Dados.class);
    marcas.stream()
            .sorted(Comparator.comparing(Dados::codigo))
            .forEach(System.out::println);

    System.out.println("Informe o codigo da marca");
    (o codigo parece funcionar só até aqui *******************************************)
    var codigoMarca = leitura.nextLine();

     endereco = endereco + "/" + codigoMarca + "/modelos";
     json = consumo.obterDados(endereco);
     var  modeloLista = conversor.obterDados(json, Modelos.class);
    System.out.println(modeloLista);

    System.out.println("\n Modelos dessa marca ");


    modeloLista.modelos().stream()
            .forEach(System.out::println);


}

}

ConsumoApi

package br.com.alura.ProjectCars.service;

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

public class ConsumoApi {

public String obterDados(String endereco){

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(endereco))
            .build();

    HttpResponse<String> response = null;

    try {
        response = client
                .send(request, HttpResponse.BodyHandlers.ofString());
    }catch (IOException e){
        throw new RuntimeException(e);
    }catch (InterruptedException e){
        throw new RuntimeException(e);
    }

    String json = response.body();
    return json;

}

}

ConverteDados

package br.com.alura.ProjectCars.service;

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

public class ConsumoApi {

public String obterDados(String endereco){

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(endereco))
            .build();

    HttpResponse<String> response = null;

    try {
        response = client
                .send(request, HttpResponse.BodyHandlers.ofString());
    }catch (IOException e){
        throw new RuntimeException(e);
    }catch (InterruptedException e){
        throw new RuntimeException(e);
    }

    String json = response.body();
    return json;

}

}

Modelos

package br.com.alura.ProjectCars.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)

public record Modelos(List modelos) {

}

DADOS

package br.com.alura.ProjectCars.model;

public record Dados(String codigo, String nome) {

}

2 respostas
solução!

Olá, Thiago!!

Há um possível erro na leitura do código de entrada quando você utiliza o método next() na função exibeMenu() da classe Principal. Este método lê os dados do teclado até encontrar um delimitador, como um espaço, uma quebra de linha ou um tab. Após isso, tudo que não foi consumido será enviado para o buffer de "lixo da memória". Quando você chama o método nextLine() para ler o próximo comando, ele vai primeiro ler esse lixo, o que pode resultar em um comportamento inesperado do código.

Aqui está uma explicação mais detalhada sobre esses métodos e possíveis soluções para o seu problema.

  • Para saber mais sobre next() e nextLine():

next()

O método next() é usado para ler a próxima sequência de caracteres até o próximo espaço em branco (espaço, tabulação ou nova linha). Ele retorna a sequência de caracteres como uma string. Este método não consome a quebra de linha (ou seja, '\n' - ENTER) após a entrada.

nextLine()

Por outro lado, o método nextLine() lê a entrada do usuário até encontrar uma quebra de linha (ou seja, \n). Ele retorna a linha inteira como uma string, incluindo o caractere de nova linha.

  • Problema com a mistura de next() e nextLine():

O problema ocorre quando você mistura chamadas de next() e nextLine() no mesmo fluxo de entrada. Após chamar next(), o cursor de leitura fica no final da palavra lida, mas não consome a quebra de linha. Se você chamar nextLine() imediatamente após next(), ele consumirá a quebra de linha pendente e retornará uma string vazia.

O mesmo problema pode ocorrer quando você ultilizar os métodos nextInt() e nextDouble() misturados com o método nextLine().

  • Possíveis soluções:
  1. Para evitar problemas, sempre use nextLine() após next() para limpar o buffer de entrada antes de ler a próxima entrada do usuário.
  2. Ao invés de utilizar o método next(), você pode utilizar o método nextLine() para ler a entrada do usuário.

Bons estudos e um abraço! :)

o problema tava no nextLine mesmo hahah sabe mt, tmj man.