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

[Dúvida] Solução do Desafio 04: Movimentação Bancária

Desafio: Movimentação Bancária

package DesafioQuatro;

import java.util.Scanner;

public class Desafio {
    public static void main(String[] args) {

        Scanner leitorDeDados = new Scanner(System.in);
        String tipoConta = "Corrente";
        String nomeCliente;
        double saldo;
        int opcaoMenu;
        String menu = """
                *** Escolha uma Opção ***
                1 - Consulta Saldo.
                2 - Transferir Valor.
                3 - Receber Valor.
                4 - Sair.
                """;

        System.out.print("Informe o nome do cliente:");
        nomeCliente = leitorDeDados.nextLine();

        System.out.print("Informe o seu saldo inicial:");
        saldo = leitorDeDados.nextDouble();

        System.out.println("****************************");
        System.out.println("Nome do Cliente: " + nomeCliente);
        System.out.println("Tipo de Conta..: " + tipoConta);
        System.out.println("Saldo..........: " + saldo);
        System.out.println("****************************");

        do {
            System.out.println(menu);
            opcaoMenu = leitorDeDados.nextInt();

            switch (opcaoMenu){
                case 1:
                    System.out.println("O saldo atualizado é: " + saldo);
                    System.out.println();
                    break;
                case 2:
                    System.out.println("Digite o valor que deseja transferir");
                    double valorTransferir = leitorDeDados.nextDouble();
                    if (valorTransferir > saldo){
                        System.out.println("Você não tem saldo suficiente para realizar a transferência.");
                        System.out.println("Seu saldo é de " + saldo);
                        System.out.println();
                    } else {
                        saldo -= valorTransferir;
                        System.out.println("O saldo atualizado é " + saldo);
                        System.out.println();
                    }
                    break;
                case 3:
                    System.out.println("Digite o valor que deseja receber");
                    double valorReceber = leitorDeDados.nextDouble();
                    saldo += valorReceber;
                    System.out.println("O saldo atualizado é " + saldo);
                    System.out.println();
                    break;
                case 4:
                    System.out.println("Você acabou de encerrar as operações.");
                    break;
                default:
                    System.out.println("Opção Inválida!");
                    System.out.println();
                    System.out.println(menu);
                    opcaoMenu = leitorDeDados.nextInt();
            }

        } while (opcaoMenu != 4);
    }
}

Eu fiz esse bloco de código acima, porém quando faço o teste, colocando primeiro uma opção inválida e escolhendo em seguida uma opção válida, ele não funciona corretamente. Onde está o erro? Eu não consegui identificar.

Obrigada!

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
2 respostas
solução!

Oi Tamires.
O erro no seu código está relacionado à maneira como você trata a opção inválida no menu.
Quando o usuário escolhe uma opção inválida e depois escolhe uma opção válida, o programa repete o menu, mas a entrada do usuário já foi consumida na primeira vez (quando você lê o número da opção inválida), e o próximo nextInt() não lê corretamente.
Isso acontece porque, ao escolher uma opção inválida, o valor de opcaoMenu é atualizado, mas o laço do-while não garante que você leia a nova opção antes de executar a lógica novamente.
Você pode corrigir isso movendo a leitura da opção de dentro do switch para fora do bloco de código que trata a opção inválida.
Assim, a opção será lida antes do switch ser executado novamente.
Aqui está a versão corrigida do seu código:

package DesafioQuatro;

import java.util.Scanner;

public class Desafio {
    public static void main(String[] args) {

        Scanner leitorDeDados = new Scanner(System.in);
        String tipoConta = "Corrente";
        String nomeCliente;
        double saldo;
        int opcaoMenu;
        String menu = """
                *** Escolha uma Opção ***
                1 - Consulta Saldo.
                2 - Transferir Valor.
                3 - Receber Valor.
                4 - Sair.
                """;

        System.out.print("Informe o nome do cliente:");
        nomeCliente = leitorDeDados.nextLine();

        System.out.print("Informe o seu saldo inicial:");
        saldo = leitorDeDados.nextDouble();

        System.out.println("****************************");
        System.out.println("Nome do Cliente: " + nomeCliente);
        System.out.println("Tipo de Conta..: " + tipoConta);
        System.out.println("Saldo..........: " + saldo);
        System.out.println("****************************");

        do {
            System.out.println(menu);
            opcaoMenu = leitorDeDados.nextInt(); // Lê a opção do menu

            switch (opcaoMenu) {
                case 1:
                    System.out.println("O saldo atualizado é: " + saldo);
                    System.out.println();
                    break;
                case 2:
                    System.out.println("Digite o valor que deseja transferir");
                    double valorTransferir = leitorDeDados.nextDouble();
                    if (valorTransferir > saldo) {
                        System.out.println("Você não tem saldo suficiente para realizar a transferência.");
                        System.out.println("Seu saldo é de " + saldo);
                        System.out.println();
                    } else {
                        saldo -= valorTransferir;
                        System.out.println("O saldo atualizado é " + saldo);
                        System.out.println();
                    }
                    break;
                case 3:
                    System.out.println("Digite o valor que deseja receber");
                    double valorReceber = leitorDeDados.nextDouble();
                    saldo += valorReceber;
                    System.out.println("O saldo atualizado é " + saldo);
                    System.out.println();
                    break;
                case 4:
                    System.out.println("Você acabou de encerrar as operações.");
                    break;
                default:
                    System.out.println("Opção Inválida!");
                    System.out.println();
                    break;
            }

        } while (opcaoMenu != 4);
    }
}

Ao entrar em um default, o laço continua corretamente e a opção inválida não "interfere" mais nas escolhas subsequentes do usuário.
Compara os códigos faz os testes e me manda um feedback.
Bons estudos.
Até...
:)

Oi Ronaldo, funcionou!
Obrigada por me ajudar a entender.
Eu estava pensando que tinha que repetir a solicitação do menu no default, porque se entrasse na opção inválida ele iria interromper o processo.
Mas consegui compreender com a sua explicação. Obrigada!