Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] [Bug] Meu While não funciona

Fiz o código, mas ele dá erro durante o looping, alguém consegue me ajudar, por favor? Não estou conseguindo debugar.

import java.util.Random;
import java.util.Scanner; // import the Scanner class

public class Adivinhacao {

    // método responsável pelo sorteio dos números inteiros de 0 a 100
    static int sorteador() {
        int numeroSorteado = new Random().nextInt(100);
        return numeroSorteado;
    }

    // saudação ao usuário da aplicação
    static void introducao() {
        System.out.println("====== Jogo da Adivinhação ======");
        System.out.println("Bem-vind@ ao jogo da adivinhação!");
        System.out.println("Um número entre 0 e 100 será sorteado");
        System.out.println("será que você é capaz de acertar?");
        System.out.println("============= Regras =============");
        System.out.println("As regras são simples, você deve ");
        System.out.println("escolher um número inteiro entre ");
        System.out.println("0 - 100. Vamos informar se seu palpite");
        System.out.println("é maior ou menor do que o número sorteado.");
        System.out.println("Você terá 5 vidas, a cada erro 1 será perdida");
        System.out.println("Vamos começar?");

    }

    // Neste método perguntamos a ele se deseja jogar, continuar jogando ou parar.
    // Fiz um unico método para ser utilizado no inicio do jogo e nas possíveis
    // repetições
    static String inputUsuarioQuerJogar() {
        System.out.println("Digite S para SIM e N para NÃO");
        try (Scanner usuarioQuerJogar = new Scanner(System.in)) {
            String respUsuarioQuerJogar = usuarioQuerJogar.nextLine();
            // com a função toUpperCase transforma toda string em caixa alta
            // com a função trim elimino espaço em branco no início e no final da string
            respUsuarioQuerJogar = respUsuarioQuerJogar.toUpperCase().trim();

            return respUsuarioQuerJogar;
        }
    }

    // Caso o usuário digite um texto diferente de S ou N o jogo é encerrado como se
    // a resposta de jogar fosse negativa
    static boolean validarRespostaUsuario(String resposta) {
        switch (resposta) {
            case "S":
                return true;
            case "N":
                return false;
            default:
                return false;
        }
    }

    static int inputPalpiteUsuario() {
        // Solicita entrada de dado do usuário no prompt de comando
        System.out.println("====== Palpite do Usuário ======");
        System.out.println("Digite seu palpite:");
        try (Scanner palpiteUsuario = new Scanner(System.in)) {
            int palpiteUser = palpiteUsuario.nextInt();
            return palpiteUser;
        }
    }

    static boolean saoIguais(int numero1, int numero2) {
        // Compara se dois números inteiros são iguais
        if (numero1 == numero2) {
            return true;
        } else {
            return false;
        }

    }

    static boolean palpiteMaior(int palpite, int sorteado) {
        // Verifica se o palpite é maior ou menor que o sorteado
        if (palpite > sorteado) {
            return true;

        } else {
            return false;
        }
    }

    public static void main(String[] args) {

        int vidas = 5;
        boolean continua = true;
        do {
            int valorSorteado = sorteador();
            introducao();

            while (vidas > 0) {
                int palpiteUsuario = inputPalpiteUsuario();

                if (saoIguais(valorSorteado, palpiteUsuario)) {
                    System.out.println("Parabéns! Você acertou o número.");
                    break; // Sai do loop se o usuário acertar
                } else {
                    System.out.println("Ops! Seu palpite está errado.");
                    vidas--;
                    if (vidas > 0) {
                        System.out.println("Você ainda tem " + vidas + " vidas. Tente novamente.");
                    } else {
                        System.out.println("Você perdeu todas as vidas. O número sorteado era: " + valorSorteado);
                    }
                }
            }

            System.out.println("Deseja jogar novamente? (S/N)");
            String resposta = inputUsuarioQuerJogar();
            continua = validarRespostaUsuario(resposta);

        } while (continua);
    }
}

Erro

Exception in thread "main" java.util.NoSuchElementException
        at java.base/java.util.Scanner.throwFor(Scanner.java:937)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at Adivinhacao.inputPalpiteUsuario(Adivinhacao.java:71)
        at Adivinhacao.main(Adivinhacao.java:106)
1 resposta
solução!

Tirando os Scanners de dentro dos try funcionou para mim. Desse jeito:

    // método responsável pelo sorteio dos números inteiros de 0 a 100
    static int sorteador() {
        int numeroSorteado = new Random().nextInt(100);
        return numeroSorteado;
    }

    // saudação ao usuário da aplicação
    static void introducao() {
        System.out.println("====== Jogo da Adivinhação ======");
        System.out.println("Bem-vind@ ao jogo da adivinhação!");
        System.out.println("Um número entre 0 e 100 será sorteado");
        System.out.println("será que você é capaz de acertar?");
        System.out.println("============= Regras =============");
        System.out.println("As regras são simples, você deve ");
        System.out.println("escolher um número inteiro entre ");
        System.out.println("0 - 100. Vamos informar se seu palpite");
        System.out.println("é maior ou menor do que o número sorteado.");
        System.out.println("Você terá 5 vidas, a cada erro 1 será perdida");
        System.out.println("Vamos começar?");

    }

    // Neste método perguntamos a ele se deseja jogar, continuar jogando ou parar.
    // Fiz um unico método para ser utilizado no inicio do jogo e nas possíveis
    // repetições
    static String inputUsuarioQuerJogar() {
        System.out.println("Digite S para SIM e N para NÃO");
        Scanner usuarioQuerJogar = new Scanner(System.in);
        String respUsuarioQuerJogar = usuarioQuerJogar.nextLine();
        // com a função toUpperCase transforma toda string em caixa alta
        // com a função trim elimino espaço em branco no início e no final da string
        respUsuarioQuerJogar = respUsuarioQuerJogar.toUpperCase().trim();

        return respUsuarioQuerJogar;
    }

    // Caso o usuário digite um texto diferente de S ou N o jogo é encerrado como se
    // a resposta de jogar fosse negativa
    static boolean validarRespostaUsuario(String resposta) {
        switch (resposta) {
            case "S":
                return true;
            case "N":
                return false;
            default:
                return false;
        }
    }

    static int inputPalpiteUsuario() {
        // Solicita entrada de dado do usuário no prompt de comando
        System.out.println("====== Palpite do Usuário ======");
        System.out.println("Digite seu palpite:");
        Scanner palpiteUsuario = new Scanner(System.in);
        int palpiteUser = palpiteUsuario.nextInt();
        return palpiteUser;
    }

    static boolean saoIguais(int numero1, int numero2) {
        // Compara se dois números inteiros são iguais
        if (numero1 == numero2) {
            return true;
        } else {
            return false;
        }

    }

    static boolean palpiteMaior(int palpite, int sorteado) {
        // Verifica se o palpite é maior ou menor que o sorteado
        if (palpite > sorteado) {
            return true;

        } else {
            return false;
        }
    }

    public static void main(String[] args) {

        int vidas = 5;
        boolean continua = true;
        do {
            int valorSorteado = sorteador();
            introducao();

            while (vidas > 0) {
                int palpiteUsuario = inputPalpiteUsuario();

                if (saoIguais(valorSorteado, palpiteUsuario)) {
                    System.out.println("Parabéns! Você acertou o número.");
                    break; // Sai do loop se o usuário acertar
                } else {
                    System.out.println("Ops! Seu palpite está errado.");
                    vidas--;
                    if (vidas > 0) {
                        System.out.println("Você ainda tem " + vidas + " vidas. Tente novamente.");
                    } else {
                        System.out.println("Você perdeu todas as vidas. O número sorteado era: " + valorSorteado);
                    }
                }
            }

            System.out.println("Deseja jogar novamente? (S/N)");
            String resposta = inputUsuarioQuerJogar();
            continua = validarRespostaUsuario(resposta);

        } while (continua);
    }

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