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

[Dúvida] Duvidas sobre o .nextLine()

Na linha 50 do código tive que alterar o .nextLine() para .next(), pois o programa não espera a entrada. Queria entender o porquê. Se na linha 17 ele espera.

Segue o código:

import java.util.Random; import java.util.Scanner;

public class Adivnhando { public static void main(String[] args) { Scanner leitura = new Scanner(System.in); int numero = new Random().nextInt(100); int chute; int tentativas; String continuar;

    System.out.format("""
    Bem vindo ao jogo de advinhação. 
    Você tem 5 tentativas de adivinhar meu número.
    Meu número será entre 0 e 100. 
    Vamos começar?(S/N)""");
    continuar = leitura.nextLine();
    while(continuar.equalsIgnoreCase("S")){
        for (int i = 0; i < 5; i++) {
            System.out.println("Digite um chute: ");
            chute = leitura.nextInt();
            if(i<4){
                if (chute > numero) {
                    System.out.println("Meu número é menor.");
                } else if (chute < numero) {
                    System.out.println("Meu número é maior.");
                } else if (chute == numero) {
                    System.out.println("Você acertou!!! Meu número é " + numero);
                    break;
                }
            }


            if(i<3) {
                tentativas = 4 - i;
                System.out.println("Restam " + tentativas + " tentativas.");
            } else if(i==3) {
                System.out.println("Última tentativa...");
            }

            if(i==4 && chute!=numero){
                System.out.println("Você não acertou. Meu número era "+numero+" T.T");
            } else if (i==4 && chute==numero) {
                System.out.println("Você acertou!!! Meu número é " + numero);
                //break;
            }
        }

        System.out.println("Quer jogar novamente? (S/N)");
        continuar = leitura.next();

    }

    System.out.println("Obrigada por jogar, até a próxima. =^.^=");


  leitura.close();

}

}

2 respostas
solução!

Olá, Mariana, tudo bem?

Quando usamos .nextLine() , ele lê a entrada até o final da linha, incluindo a quebra de linha. Já .nextInt(), .nextDouble() eles leem apenas o valor do tipo específico que esperamos (inteiro, double, etc.) e deixam quaisquer caracteres restantes (como quebras de linha) na entrada. Isso significa que, após usar um desses métodos, a quebra de linha que vem depois do valor digitado permanece na entrada, sem ser lida.

No seu código, isso cria um problema após usar .nextInt(), pois a quebra de linha fica na entrada. Quando você tenta usar .nextLine() novamente, ele apenas lê essa quebra de linha pendente, não esperando uma nova entrada. Para resolver, é só adicionar uma chamada extra de .nextLine() após cada .nextInt() para consumir essa quebra de linha pendente. Assim, o Scanner aguardará corretamente uma nova entrada do usuário.

Espero ter esclarecido.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Nossa, muito obrigada!!! Entendi perfeitamente!!!

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