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

Por que precisei fazer isso para a busca funcionar?

Olá a todos!

Mesmo criando o código conforme passado em aula, a minha busca estava dando erro:

private void buscarFuncionarioPeloNome(Scanner scanner) {
        System.out.println("Digite o nome a ser pesquisado");
        String nome = scanner.nextLine();
        List<Funcionario> funcionariosPorNome = funcionarioRepository.findByNome(nome);
        funcionariosPorNome.forEach(System.out::println);
    }

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

A pesquisa só saiu desse "loop" depois que eu adicionei essa linha ao código:

private void buscarFuncionarioPeloNome(Scanner scanner) {
        System.out.println("Digite o nome a ser pesquisado");
        String nome = scanner.nextLine();
        nome += scanner.nextLine();  // linha adicionada
        List<Funcionario> funcionariosPorNome = funcionarioRepository.findByNome(nome);
        funcionariosPorNome.forEach(System.out::println);
    }

Alguém consegue me explicar o motivo?

3 respostas
solução!

Acredto que o problema tenha sido na utilização do método nextLine() da classe Scanner. Se você observar sua pesquisa só funcionou quando vc rodou ele duas vezes. Quando esse método é chamado no seu código original ele funciona da seguinte forma: pula a linha logo após em que você digitou o 1, e não retorna nada para sua busca porque por padrão ele retorna o texto que pulou naquela linha.

Sua busca findByNome é feita sem um nome e em seguida volta a execução na pergunta "Que busca deseja realizar". No seu segundo exemplo ao chamar o método mais uma vez, ele espera que vc digite novamente pois já executou o nextLine() na linha anterior.

Se você testar os seguintes trechos:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String fim = "Fim da execução";

        System.out.println("digite 1 para simular a escolha da opção");
        Integer um = scanner.nextInt();
        System.out.println(um);

        System.out.println("Digite a linha...");
        String linhaDigitada = scanner.nextLine();

        System.out.println("Linha digitada:" + linhaDigitada);
        System.out.println(fim);
        scanner.close();
    }
}

Neste exemplo ele vai imprimir : 1 Digite a linha... Fim da execução

Logo em seguida sem te dar um prompt para digitar uma linha.

Se voce colocar

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String fim = "Fim da execução";

        System.out.println("digite 1 para simular a escolha da opção");
        Integer um = scanner.nextInt();
        System.out.println(um);

        System.out.println("Digite a linha...");
        scanner.nextLine(); // Essa linha adicional da mesma forma que fez no seu código
        String linhaDigitada = scanner.nextLine();

        System.out.println("Linha digitada:" + linhaDigitada);
        System.out.println(fim);
        scanner.close();
    }
}

Ele irá funcionar da forma esperada e espera você digitar uma linha antes de mostrar "Fim da execução"

Pra entender melhor o que acontece, você pode digitar "1 1" quando o console te pedir o número da opção.

Nesse caso o scanner.nextInt() vai retornar o 1, que é o próximo inteiro. Porém o Scanner vai parar logo após ele, na mesma linha. A linha:

1 1

O scanner vai estar na posição do asterisco:

1* 1

Quando você roda o método nextLine(), como ele não está no início de uma nova linha, ele vai pular para a próxima e retornar todo o texto que ainda tinha nesta linha, no caso " 1"

O código

public class TestScanner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Digite 1 1");
        Integer numero = scanner.nextInt();

        System.out.println("Número:" + numero);
        System.out.println("Digite a linha!");
        String linha = scanner.nextLine();

        System.out.println("Linha: "+linha);
        scanner.close();
    }
}

Tem como saída:

Digite 1 1

Digite no console: 1 1 separado por espaço

Número:1

Digite a linha!

Linha: 1

Caso você rode o nextLine() em seguida, e dessa vez digite o nome que deseja buscar por exemplo, ele estará no início da linha que você digitou o nome, vai pular para a próxima linha e retornar o nome que foi digitado, funcionando da forma esperada.

Entendi, muito obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software