1
resposta

[Projeto] Projeto Conta bancaria

Fala pessoal tudo bem?

Queria deixar aqui minha resolução do desafio da aula

import java.util.Scanner;

public class Desafio {
    public static void main(String[] args) {
        //menu inicial
        String nome = "Matheus Bispo Arnou";
        String tipoConta = "Conta corrente";
        double saldoInicial = 2500;
        Scanner entradaDeDados = new Scanner(System.in);
        System.out.println("************************************");
        System.out.println("Cliente: " + nome);
        System.out.println("Tipo de conta: " + tipoConta);
        System.out.println("Saldo atual R$: " + saldoInicial);
        System.out.println("************************************");
        System.out.println("Operações\n\n");
        System.out.println(
                        "1 - Consultar Saldo\n" +
                        "2 - Receber um valor\n" +
                        "3 - Transferir valor\n" +
                        "4 - Sair\n" +
                        "Digite uma opção:\n"
        );

        int opcao = entradaDeDados.nextInt();
        while (opcao != 4) {
            switch (opcao) {
                case 1:
                    System.out.println("Seu saldo atual é de R$ " + saldoInicial);
                    break;
                case 2:
                    System.out.println("Informe o valor a ser recebido R$ ");
                    double valorDeposito = entradaDeDados.nextDouble();
                    if (valorDeposito <= 0) {
                        System.out.println("Por favor, digite um valor válido acima de R$ 0,01");
                        break;
                    } else {
                        saldoInicial += valorDeposito;
                        System.out.println("Valor recebido R$ " + valorDeposito + " saldo atual em conta R$ " + saldoInicial);
                    }
                    break;
                case 3:
                    System.out.println("Informe o valor que irá transferir R$ ");
                    double valorTransferir = entradaDeDados.nextDouble();
                    if (valorTransferir > saldoInicial) {
                        System.out.println("Saldo insuficiente");
                    } else {
                        saldoInicial -= valorTransferir;
                        System.out.println("Transferido o valor de R$ " + valorTransferir + " saldo atual em conta R$ " + saldoInicial);
                    }
                    break;
                case 4:
                    System.out.println("Programa Encerrado");
                    break;
                default:
                    System.out.println("Opção inválida. Tente novamente");
            }
            System.out.println(
                    "1 - Consultar Saldo\n" +
                            "2 - Receber um valor\n" +
                            "3 - Transferir valor\n" +
                            "4 - Sair\n" +
                            "Digite uma opção:\n"
            );
            opcao = entradaDeDados.nextInt();
        }
    }
}

Queria uma explicação no fim eu tive que colocar opcao = entradaDeDados.nextInt(); se não o código entrava em um loop infinito poderiam me explicar um pouco melhor sobre isso?

1 resposta

Olá, Matheus!

Está ocorrendo esse loop infinito, pois este método lê os dados do teclado até encontrar um delimitador, como um espaço, uma quebra de linha ou um tab. Após isso, tudo que não foi consumido será enviado para o buffer de "lixo da memória". Você é obrigado a chamar o método nextLine() para ler esse lixo e evitar esse tipo de problema.

Aqui está uma explicação mais detalhada sobre esses métodos e uma solução parecida com a sua para esse problema.

nextInt()

O método nextInt() é usado para ler um número inteiro até o próximo espaço em branco (espaço, tabulação ou nova linha). Este método não consome a quebra de linha (ou seja, '\n' - ENTER) após a entrada.

nextLine()

Por outro lado, o método nextLine() lê a entrada do usuário até encontrar uma quebra de linha (ou seja, \n). Ele retorna a linha inteira como uma string, incluindo o caractere de nova linha.

O mesmo problema pode ocorrer quando você ultilizar os métodos como next() e nextDouble().

Para evitar problemas, sempre use nextLine() após nextInt() para limpar o buffer de entrada antes de ler a próxima entrada do usuário.