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

Erro com a classe Scanner

Por algum motivo, quando chega na hora de escrever o nome do produto, o console da IDE ignora o nextLine() e vai para a próxima linha.

screenshot

screenshot2

Eu já havia usado um nextLine() para definir o nome do "Titular" e funcionou normalmente.

Tentei colocar apenas next() mas com ele não consigo escrever uma string com 2 palavras ou mais, aparece esse erro no console:

screenshot3

Existe alguma forma de contornar esse problema?

4 respostas

Oi!

Manda aqui o seu código completo.

Aqui está

package br.com.alura.desafio.aplicacaodecompras.principal;

import br.com.alura.desafio.aplicacaodecompras.modelos.Compra;
import br.com.alura.desafio.aplicacaodecompras.modelos.Conta;

import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);

        System.out.println("Digite seu nome: ");
        String nome = leitura.nextLine();
        System.out.println("Digite seu saldo: ");
        double novoLimite = leitura.nextDouble();

        Conta conta1 = new Conta(nome,novoLimite);
        conta1.mostraInfo();

        String menu = "-- Menu de interação -- \n1- Nova compra \n2- Sair";
        int sair = 0;

        while (sair != 2) {
            System.out.println("Novo produto: ");
            String novoProduto = leitura.next();

            System.out.println("Valor: ");
            double novoValor = leitura.nextDouble();

            Compra compra1 = new Compra(novoProduto,novoValor);
            boolean compraRealizada = conta1.lancaCompra(compra1);

            if (compraRealizada) {
                System.out.println("Compra realizada!\n");
                System.out.println(menu);
                sair = leitura.nextInt();
            } else {
                System.out.println("Saldo insuficiente!\n");
                sair = 2;
                leitura.close();
            }
        }

        System.out.println("*******************************");
        if(conta1.getCompras().size() > 0) {
            System.out.println("COMPRA FINALIZADA: \n");
            Collections.sort(conta1.getCompras());
            for (Compra compra : conta1.getCompras()) {
                System.out.println(compra);
            }
        } else {
            System.out.println("NENHUMA COMPRA REALIZADA!");
        }
        System.out.println("*******************************\n");
        System.out.printf("Saldo atual: R$%.2f \n",conta1.getSaldo());
    }
}
solução!

O problema ocorre quando você lê um valor double usando nextDouble() ou int usando nextInt() e, em seguida, lê uma linha inteira usando nextLine().

Para corrigir esse problema, você pode adicionar um leitura.nextLine() logo após a leitura do valor double para consumir a quebra de linha pendente. Assim, a leitura da próxima linha será realizada corretamente.

public static void main(String[] args) {
    Scanner leitura = new Scanner(System.in);

    System.out.println("Digite seu nome: ");
    String nome = leitura.nextLine();
    
    System.out.println("Digite seu saldo: ");
    double novoLimite = leitura.nextDouble();
    leitura.nextLine();

    Conta conta1 = new Conta(nome,novoLimite);
    conta1.mostraInfo();

    String menu = "-- Menu de interação -- \n1- Nova compra \n2- Sair";
    int sair = 0;

    while (sair != 2) {
        System.out.println("Novo produto: ");
        String novoProduto = leitura.nextLine();

        System.out.println("Valor: ");
        double novoValor = leitura.nextDouble();
        leitura.nextLine();

        Compra compra1 = new Compra(novoProduto, novoValor);
        boolean compraRealizada = conta1.lancaCompra(compra1);

        if (compraRealizada) {
            System.out.println("Compra realizada!\n");
            System.out.println(menu);
            
            sair = leitura.nextInt();
            leitura.nextLine();
        } else {
            System.out.println("Saldo insuficiente!\n");
            sair = 2;
            leitura.close();
        }
    }

    System.out.println("*******************************");
    if(conta1.getCompras().size() > 0) {
        System.out.println("COMPRA FINALIZADA: \n");
        Collections.sort(conta1.getCompras());
        for (Compra compra : conta1.getCompras()) {
            System.out.println(compra);
        }
    } else {
        System.out.println("NENHUMA COMPRA REALIZADA!");
    }
    System.out.println("*******************************\n");
    System.out.printf("Saldo atual: R$%.2f \n",conta1.getSaldo());
}

Para não ter essa necessidade de ter que ficar chamando o método nextLine(), você deve sempre utilizar o método nextLine() para ler os valores, fazendo a conversão quando não forem String:

public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);

        System.out.println("Digite seu nome: ");
        String nome = leitura.nextLine();
        System.out.println("Digite seu saldo: ");
        double novoLimite = Double.parseDouble(leitura.nextLine());

        Conta conta1 = new Conta(nome,novoLimite);
        conta1.mostraInfo();

        String menu = "-- Menu de interação -- \n1- Nova compra \n2- Sair";
        int sair = 0;

        while (sair != 2) {
            System.out.println("Novo produto: ");
            String novoProduto = leitura.nextLine();

            System.out.println("Valor: ");
            double novoValor = Double.parseDouble(leitura.nextLine());

            Compra compra1 = new Compra(novoProduto, novoValor);
            boolean compraRealizada = conta1.lancaCompra(compra1);

            if (compraRealizada) {
                System.out.println("Compra realizada!\n");
                System.out.println(menu);
                sair = Integer.parseInt(leitura.nextLine());
            } else {
                System.out.println("Saldo insuficiente!\n");
                sair = 2;
                leitura.close();
            }
        }

        System.out.println("*******************************");
        if(conta1.getCompras().size() > 0) {
            System.out.println("COMPRA FINALIZADA: \n");
            Collections.sort(conta1.getCompras());
            for (Compra compra : conta1.getCompras()) {
                System.out.println(compra);
            }
        } else {
            System.out.println("NENHUMA COMPRA REALIZADA!");
        }
        System.out.println("*******************************\n");
        System.out.printf("Saldo atual: R$%.2f \n",conta1.getSaldo());
    }

}

Fiz e funcionou!

Obrigado pela ajuda, quebrei um pouco a cabeça com isso mas é algo que nunca mais vou esquecer.