2
respostas

[Sugestão] Minha resolução do projeto conta brancária

package com.example;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Digite seu nome:");
        String nome = sc.nextLine(); // mesmo se eu digitar um número, o programa vai aceitar
        int escolhaConta;
        String tipoConta = "";
        double saldo;
        int escolhaOperacoes;
        double valor;
        String apenasNumeros = "Erro! Digite apenas números";
        String opcaoInvalida = "Opção inválida! Teste novamente";

        do {
            try {
                System.out.print("""
                                Selecione o tipo de conta:
                                Corrente (1)
                                Poupança (2)
                                Salário  (3)
                                """);
                escolhaConta = sc.nextInt();
                switch (escolhaConta) {
                    case 1 -> {
                        tipoConta = "Corrente";
                    }
                    case 2 -> {
                        tipoConta = "Poupança";
                    }
                    case 3 -> {
                        tipoConta = "Salário";
                    }
                    default -> System.out.println(opcaoInvalida);
                }
            } catch(InputMismatchException e) {
                System.out.println(apenasNumeros);
                sc.nextLine(); // limpa o buffer
                escolhaConta = 0; //faz o loop ser inicado novamente
            }
        }while(escolhaConta <1 || escolhaConta >3);

        do{
            try{
            System.out.print("Informe um saldo inicial: ");
            saldo = sc.nextDouble();
            break; // sai do loop se conseguir um input válido

            }catch (InputMismatchException e) {
                System.out.println(apenasNumeros);
                sc.nextLine();
            }
        }while(true);

        System.out.println(String.format("""
        ***************************************
        Dados iniciais do cliente:

        Nome:  %s
        Tipo da conta: %s
        Saldo inicial: %.2f

        ***************************************
        """, nome, tipoConta, saldo));

            do{
                try {
                    System.out.println(String.format("""
            Operações 
            
            1- Consultar saldos
            2- Receber valor
            3- Transferir valor
            4- Sair
            """));
                escolhaOperacoes = sc.nextInt();
                switch (escolhaOperacoes) {
                    case 1 -> {
                        System.out.println(String.format("R$%.2f", saldo));
                    }
                    case 2 -> {
                        System.out.println("Informe o valor a receber: ");
                        valor = sc.nextDouble();
                        saldo += valor;
                    }
                    case 3 -> {
                        System.out.println("Informe o valor a enviar: ");
                        valor = sc.nextDouble();
                        saldo -= valor;
                    }
                    case 4 -> {
                        System.out.println("Saindo ...");
                    }
                    default -> System.out.println(opcaoInvalida);
                }
            } catch (InputMismatchException e ){
                System.out.println(apenasNumeros);
                sc.nextLine();
                escolhaOperacoes = 0;
            }
        }while(escolhaOperacoes !=4);

        sc.close();
    }
    }
2 respostas

Oi, Luís! Como vai?

Gostei bastante da sua organização com do-while e do uso de try-catch para tratar entradas inválidas. Isso mostra um cuidado importante com a experiência do usuário, principalmente ao limpar o buffer com sc.nextLine() para evitar erros em sequência.

Uma dica interessante para o futuro é usar um método separado para validar entradas numéricas, deixando o código mais reutilizável:


public static int lerNumero(Scanner sc) {
    while (true) {
        try {
            return sc.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Digite apenas numeros");
            sc.nextLine();
        }
    }
}

Esse código cria um método que sempre retorna um número válido, evitando repetir try-catch em vários pontos.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oi, Amaro. Obrigado pela dica, gostei da ideia de reduzir o boilerplate. Repetir código nunca é bom, por isso vou usar esse código como referência e usar dessa experiência para melhorar meus códigos conforme eu for praticando