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, 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!
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.
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!