Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao ler com a classe scanner

Estou fazendo uma aplicação parecida com o desafio, mas ao ler dados com a classe Scanner, estou recebendo um erro.

Essa é parte do código:

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

        do {
            System.out.println("---------------------------\n" +
                    "Ola! Bem vindo ao gerenciador de panificadora!\n" +
                    "---------------------------\n" +
                    "Entre com a opcao desejada: \n" +
                    "1 - Cadastrar produto\n" +
                    "0 - Sair\n");

            opcao = leitura.nextInt();

            switch (opcao) {
                case 1:
                    System.out.println("Novo cadastro de produto - Digite o nome: ");
                    String nome = leitura.next();

                    System.out.println("Digite o preco: ");
                    double preco = leitura.nextDouble();

                    Produto novoProduto = new Produto(nome, preco);
                    System.out.println(novoProduto);
                    break;

                default:
                    System.out.println("Essa nao eh uma opcao valida!");
            }

        }while (opcao != 0);

Esse é o erro: Erro

2 respostas
solução!

Esse erro ocorre quando scanner encontra um valor para ser lido que não corresponde ao tipo de dado esperado. No caso, do trecho de código String nome = leitura.next(); neste caso o método next() lê a próxima sequência de caracteres até o próximo espaço em branco. E ao digitar "suco de laranja" o Scanner lê "suco" e o restante permanece no buffer de entrada. Assim quando você chama nextDouble(), ele tenta ler o próximo valor no buffer. No entanto, o buffer ainda contém a nova linha pendente, e como uma nova linha não pode ser convertida em um valor decimal, ocorre uma exceção. Você pode utilar o nextLine() para corrigir o erro.

Para que o código funcione normalmente você precisará garantir que a nova linha seja consumida e o buffer esteja limpo antes de prosseguir para a próxima leitura ou entrada. Portanto na variável opcao que recebe o método leitura.nextInt(); você pode colocar depois leitura.nextLine(); garatindo que buffer esteja limpo. Então fica assim:

 opcao = leitura.nextInt();
  leitura.nextLine();

            switch (opcao) {
                case 1:
                    System.out.println("Novo cadastro de produto - Digite o nome: ");
                    String nome = leitura.nextLine();
//restante do código

Resolveu. Depois também estava recebendo um erro pois estava inserindo o valor decimal com ponto, mas é com vírgula. Então invés de inserir 3.4 é 3,4 no terminal. Enfim, obrigada!