NoSuchElementException error when capturing data entry with Scanner

0

I'm having problems with data entries using Scanner with JOptionPane working fine.

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();

    }
}
    
asked by anonymous 02.06.2017 / 03:03

1 answer

1

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

So, when trying to return to the menu, this exception pops up in the opcao = leitura.nextInt(); line, since you have already closed System.in , which is responsible for data entry in java globally, including the variable leitura , open in your main.

One of the possible solutions without too much code change is to work only with a Scanner variable, 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());
        }
    }
}

Notice that you have a leitura.nextLine() shortly after picking up the option, and this is to make sure you do not miss the space and skip one of the data entries, if the option chosen is 1. But this is not the recommended solution, read in this answer , which has a better orientation on how to avoid this type of escape.

    
02.06.2017 / 03:43