Dúvida básica Java [erro Exception in thread "main" java.util.NoSuchElementException]

Bom… eu criei uma função “escolha” que vai receber um parâmetro inteiro no qual o usuário vai digitar.
A partir da escolha do usuário eu vamos pra função “fazer jogo” que tem uma estrutura switch conforme mostrarei mais na frente.

O meu programa roda perfeitamente quando eu escolho a opção 1 que gera números aleatórios, entretanto quando uso a opção 2 no qual eu devo digitar os números ele dá o seguinte erro abaixo:

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 Loteria.Usuario.fazerJogo(Usuario.java:58)
at Loteria.SistemaLoterica.main(SistemaLoterica.java:11)

Segue o código abaixo:

int escolha() {

	System.out.println("Seja bem vindo ao programa: \n*** Mega do Lepo-Lepo ***");

	System.out.println("Escolha a forma como deseja jogar... \n");

	Scanner entrada = new Scanner(System.in);

	System.out.println("Gerar números aleatórios.\nDigite:1\n");

	System.out.println("Escolher seus números.\nDigite:2");
	int valor = entrada.nextInt();

	entrada.close();

	return valor;
}

int[] fazerJogo(int escolha) {
		

	int[] numeroSortiado = new int[6];
	switch (escolha) {
	case 1:
		for (int i = 0; i < 6; i++) {
			numeroSortiado[i] = (int) (1 + Math.random() * 60);
			for (int j = 0; j < 6; j++) {
				numeroSortiado[j] = numeroSortiado[i];
				// essa estrutura é para evitar gerar numero repetitivos
				while ((numeroSortiado[i] == numeroSortiado[j]) && (j != i)) {
					numeroSortiado[j] = (int) (1 + Math.random() * 60);
				}
			}

		}

		System.out.println("Seu número sortiado foi: " + Arrays.toString(numeroSortiado));

		break;

	case 2:
		
		Scanner entrada = new Scanner(System.in);	
		for (int i = 0; i < 6; i++) {

			System.out.println("Digite o " + (i + 1) + "º" + " número inteiro:");
			
			numeroSortiado[i] = entrada.nextInt();
			
		}

		System.out.printf(Arrays.toString(numeroSortiado));
		
		entrada.close();
		
		break;

	}
	
	return numeroSortiado;
}

Cara, tá usando alguma IDE? Ou está codificando no notepad mesmo?

Cara, cadê os modificadores, você está usando o padrão! Avalie se não é melhor usar o public, private ou outro!


Agora eu vi que você criou e fechou o escaner duas vezes, isso pode gerar um erro! Instância objeto, scanner no começo e fecha apenas no final do seu programa!

1 curtida

Estou usando o Eclipse

Cara funcionou, só ficou com um sinal de exclamação no 1º método onde retirei o closed.
Eu jurava que pelo fato do scanner está em métodos diferentes eu deveria usar o “.closed()” em cada um dos métodos.
Bom… se alguém não entendeu o que fiz pra resolver foi o seguinte: Com a dica do colega, eu simplesmente apaguei o primeiro “.closed” e rodei o código.

Rpz… eu já tinha tentado de tudo quanto é forma pra rodar esse código.
Muito obrigado.

Ah, em relação aos modificadores eu não mostrei porque na minha visão não era importante afinal de contas todo o programa estava funcionando corretamente, menos a entrada quando usava a opção 2.

Pra quem quiser ver um pouco do programa rodando… Em breve postarei no meu git.
Agora que consegui resolver aquele problema vou refatora-lo e incrementar mais opções.

Obrigados a todos.

Só um detalhe!!! Você não precisa criar mais de um objeto scanner, você cria no início e passa por referência!!! Ex:

public MinhaClasse{
   public static void main(String[] args){
     //Crio no início
     Scanner scan = new Scanner(System.in);
      
     //Todos os métodos, objetos que vão usar o  scanner!
     exemplo1(scan);
     exemplo2(scan);

     //Fecho no final
     scan.close();

   }

   public static void exemplo1(Scanner scan){
       String s = scan.nextLine();
       System.out.println("Metodo 1: "+s);
   }

   public static void exemplo2(Scanner scan){
       String s = scan.nextLine();
       System.out.println("Metodo 2: "+ s);
   }
}

Ou definir o scanner como public static:

public MinhaClasse{
   //Crio o Scanner!!
   public static Scanner scan = new Scanner(System.in);
    
   public static void main(String[] args){
      
     //Todos os métodos, objetos que vão usar o  scanner!
     exemplo1();
     exemplo2();

     //Fecho no final
     scan.close();

   }

   public static void exemplo1(){
       String s = MinhaClasse.scan.nextLine();
       System.out.println("Metodo 1: "+s);
   }

   public static void exemplo2(){
       String s = MinhaClasse.scan.nextLine();
       System.out.println("Metodo 2: "+ s);
   }
}

Dessa maneira existe apenas um para o programa todo!

1 curtida

Entendi,perfeitamente !! Vou fazer isso.
Obrigado!

1 curtida