Nosuchelementexception error when capturing data input with Scanner

Asked

Viewed 5,200 times

1

I’m having problems with data inputs using Scanner with Joptionpane works well.

Exception in thread "main" java.util.NoSuchElementException

  at java.util.Scanner.throwFor(Unknown Source)
  at java.util.Scanner.next(Unknown Source)
  at java.util.Scanner.nextInt(Unknown Source)
  at java.util.Scanner.nextInt(Unknown Source)
  at pkgClientesPedidosDiogoVinicius.TesteClientesPedidos.menu(TesteClientesPedidos.java:43)
  at pkgClientesPedidosDiogoVinicius.TesteClientesPedidos.main(TesteClientesPedidos.java:18)
import java.io.IOException;

import java.util.Scanner;


public class TesteClientesPedidos {

    static int opcao;

    public static void main(String[] args) throws IOException {
        menu();

    }

    static void menu() throws IOException {

        Scanner leitura = new Scanner(System.in);
        do {
            System.out.println("PROGRAMA CLIENTES/PEDIDOS - OPÇÕES\n");
            System.out.println("----------------------------------\n");
            System.out.println("1  - Cadastrar Gerente\n");
            System.out.println("2  - Cadastrar Vendedor\n");
            System.out.println("3  - Cadastrar Técnico\n");
            System.out.println("4  - Mostrar dados dos funcionarios(Gerente/Vendedor/Técnico\n");
            System.out.println("5  - Cadastrar Item de Pedido\n");
            System.out.println("6  - Cadastrar Pedido\n");
            System.out.println("7  - Mostrar Dados de Pedido e Item de Pedido\n");
            System.out.println("8  - Cadastrar Gerente Administrativo\n");
            System.out.println("9  - Cadastrar Gerente Financeiro\n");
            System.out.println("10 - Mostrar dados de Gerente Administrativo e Financeiro\n");
            System.out.println("11 - Mostrar cálculo do salário para cada funcionario (Gerente/Vendedor/Técnico\n");
            System.out.println("12 - Sobre\n");
            System.out.println("13 - Encerrar programa\n");

            System.out.println("Informe a opção:");
            opcao = leitura.nextInt();
            switch (opcao) {
            case 1:
                cadastrarGerente();
                System.out.println(">>PROGRAMA");
                break;
            case 13:
                System.out.println(">>PROGRAMA FINALIZADO");
                break;
            }

        } while (opcao != 13);
        leitura.close();
    }

    public static void cadastrarGerente() {

        String nome;
        int matricula;
        String telefone;
        String email;
        String cidade;
        String estado;
        double salario;
        double taxaVenda;

        Scanner entrada = new Scanner(System.in);

        System.out.println("CADASTRAR GERENTE\n");
        System.out.println("Nome:........:");
        nome = entrada.nextLine();

        System.out.println("Matricula:...:");
        matricula = entrada.nextInt();

        System.out.println("Telefone:....:");
        telefone = entrada.next();

        System.out.println("Cidade:......:");
        cidade = entrada.nextLine();
        entrada.next();

        System.out.println("E-mail:......:");
        email = entrada.nextLine();
        entrada.next();

        System.out.println("Salário:.....:");
        salario = entrada.nextDouble();

        System.out.println("Estado:......:");
        estado = entrada.nextLine();
        entrada.next();

        Gerente g1 = new Gerente(nome, matricula, telefone, email, cidade, estado, salario);

        try {
            System.out.println("Taxa Venda:..:");
            taxaVenda = entrada.nextDouble();
            g1.setTaxaVenda(taxaVenda);

        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        entrada.close();

    }
}

2 answers

4


The problem is that you are manipulating two variables for data entry, and you are closing the second. Only by doing entrada.close();, you are terminating the data entry(the System.in) and not just the variable.

With this, when trying to return to the menu, pop this exception on the line opcao = leitura.nextInt();, because you’ve already closed the System.in, that the person responsible for the java data entry in a global way, including the variable leitura, opened in its main.

One of the possible solutions without changing the code too much is to work with only one variable Scanner, and use it to capture all entries in this class:

import java.io.IOException;
import java.util.Scanner;

public class TesteClientesPedidos {

    static int opcao;
    static Scanner leitura = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        menu();

    }

    static void menu() throws IOException {

        do {
            System.out.println("PROGRAMA CLIENTES/PEDIDOS - OPÇÕES\n");
            System.out.println("----------------------------------\n");
            System.out.println("1  - Cadastrar Gerente\n");
            System.out.println("2  - Cadastrar Vendedor\n");
            System.out.println("3  - Cadastrar Técnico\n");
            System.out.println("4  - Mostrar dados dos funcionarios(Gerente/Vendedor/Técnico\n");
            System.out.println("5  - Cadastrar Item de Pedido\n");
            System.out.println("6  - Cadastrar Pedido\n");
            System.out.println("7  - Mostrar Dados de Pedido e Item de Pedido\n");
            System.out.println("8  - Cadastrar Gerente Administrativo\n");
            System.out.println("9  - Cadastrar Gerente Financeiro\n");
            System.out.println("10 - Mostrar dados de Gerente Administrativo e Financeiro\n");
            System.out.println("11 - Mostrar cálculo do salário para cada funcionario (Gerente/Vendedor/Técnico\n");
            System.out.println("12 - Sobre\n");
            System.out.println("13 - Encerrar programa\n");

            System.out.println("Informe a opção:");
            opcao = leitura.nextInt();
            leitura.nextLine();
            switch (opcao) {
            case 1:
                cadastrarGerente();
                System.out.println(">>PROGRAMA");
                break;
            case 13:
                System.out.println(">>PROGRAMA FINALIZADO");
                break;
            }

        } while (opcao != 13);
        leitura.close();
    }

    public static void cadastrarGerente() {

        String nome;
        int matricula;
        String telefone;
        String email;
        String cidade;
        String estado;
        double salario;
        double taxaVenda;

        System.out.println("CADASTRAR GERENTE\n");
        System.out.println("Nome:........:");
        nome = leitura.nextLine();

        System.out.println("Matricula:...:");
        matricula = leitura.nextInt();

        System.out.println("Telefone:....:");
        telefone = leitura.next();

        System.out.println("Cidade:......:");
        cidade = leitura.nextLine();
        leitura.next();

        System.out.println("E-mail:......:");
        email = leitura.nextLine();
        leitura.next();

        System.out.println("Salário:.....:");
        salario = leitura.nextDouble();

        System.out.println("Estado:......:");
        estado = leitura.nextLine();
        leitura.next();

        Gerente g1 = new Gerente(nome, matricula, telefone, email, cidade, estado, salario);

        try {
            System.out.println("Taxa Venda:..:");
            taxaVenda = leitura.nextDouble();
            g1.setTaxaVenda(taxaVenda);

        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

Realize you have one leitura.nextLine() right after picking up the option, and this is not to miss the space and skip one of the data entries, if the option chosen is 1. But this is not the recommended solution, I recommend that you take a read in this answer, who has a better orientation on how to avoid this type of escape.

-1

For those who still have the problem, just need to clean the Scanner before using it again with a

scanner.clear()

before using or at the end of the while.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.