Switch - Case

Pessoal, eu tenho um menu, que ao selecionar uma opção, possa-se voltar à tela inicial.
Pensei na estrutura de Repetição Switch. Mas não está funcionando. Quando eu “volto”, ele entra em Sacar e pede o valor. Pensei em colocar o break, mas como é parada, não funciona.

import java.util.Scanner;
    public class Main {

    	public static void main(String[] args) {
    		Scanner ler = new Scanner(System.in);
    		Banco c6Bank = new Banco();
    		String num = "0";
    		System.out.print("BEM VINDO AO C6 BANK!\n");
    		switch(num) {
    			case "0":
    				System.out.print("1: Criar nova conta\n2: Dopósito\n3: Saque\n3: Transferência\n4: Saldo\n6: Extrato\nDigite aqui:");
    				num = ler.next();
    				
    	
    			case "1":
    				System.out.print("Digite seu nome: ");		
    				String nome = ler.next();
    				Cliente cliente = new Cliente(nome);
    				c6Bank.novaConta(cliente);
    				System.out.print("\nSeja bem vindo(a) "+cliente.getNome()+ ", Sua conta foi criada\n");
    				System.out.print("0: Voltar para o menu \n");
    		
    			case "2":
    				
    				System.out.println("Quanto deseja depositar? \n");
    				double valor = ler.nextDouble();
    				System.out.print("0: Voltar para o menu \n");
    				
    			case "3":
    				System.out.println("Quanto deseja Sacar? \n");
    				valor = ler.nextDouble();
    				System.out.print("0: Voltar para o menu \n");
    			
    			case "4":
    				System.out.print("Para quem deseja tranferir?  \n");
    				nome = ler.next();
    				System.out.print("Quanto deseja transferir?  \n");
    				valor = ler.nextDouble();
    				System.out.print("0: Voltar para o menu \n");
    				
    			case "5":
    				System.out.print("0: Voltar para o menu \n");
    				
    			case "6": 
    				System.out.print("0: Voltar para o menu \n");
    		}
    	}

Obs.: As funções do menu ainda não estão totalmente implementas. Quero resolver esse problema antes.

Desde já, agradeço quem puder me ajudar.

O switch tem um comportamento chamado fall through: quando ele cai em um case, ele acaba executando todos os outros case's depois, até encontrar um break. Por exemplo, o código abaixo:

int n = 1;
switch(n) {
    case 0:
        System.out.println("n=0");
    case 1:
        System.out.println("n=1");
    case 2:
        System.out.println("n=2");
    case 3:
        System.out.println("n=3");
}

Imprime o seguinte:

n=1
n=2
n=3

Pois quando ele entra em um case, ele executa aquele e todos os outros que vêm depois (no caso, ele entra no case 1, executa ele, e depois executa o case 2 e case 3). É contraintuitivo, mas é assim que funciona.

O fall through só é interrompido se encontrar um break. Ou seja, se estiver assim:

int n = 1;
switch(n) {
    case 0:
        System.out.println("n=0");
    case 1:
        System.out.println("n=1");
    case 2:
        System.out.println("n=2");
        break;
    case 3:
        System.out.println("n=3");
}

Aí ele só imprime até o 2:

n=1
n=2

Então a solução é colocar um break para cada case. E se quer que ele fique repetindo as opções, coloque isso em loop. Outro detalhe é que misturar leitura de strings e números pode causar problemas (leia aqui para entender melhor) e o melhor para ler entradas do teclado é sempre trabalhar com linhas (portanto, usando nextLine). Também sugiro incluir uma opção para interromper o loop:

Scanner ler = new Scanner(System.in);
Banco c6Bank = new Banco();
System.out.print("BEM VINDO AO C6 BANK!\n");
while (true) {
    System.out.print("1: Criar nova conta\n2: Dopósito\n3: Saque\n3: Transferência\n4: Saldo\n6: Extrato\n0 para sair\nDigite aqui:");
    String num = ler.nextLine();
    if ("0".equals(num))
        break; // sai do while
    switch (num) {
        case "1":
            System.out.print("Digite seu nome: ");
            String nome = ler.nextLine();
            Cliente cliente = new Cliente(nome);
            c6Bank.novaConta(cliente);
            System.out.print("\nSeja bem vindo(a) " + cliente.getNome() + ", Sua conta foi criada\n");
            break;

        case "2":
            System.out.println("Quanto deseja depositar? \n");
            double valor = Double.parseDouble(ler.nextLine());
            break;

        case "3":
            System.out.println("Quanto deseja Sacar? \n");
            valor = Double.parseDouble(ler.nextLine());
            break;

        case "4":
            System.out.print("Para quem deseja tranferir?  \n");
            nome = ler.nextLine();
            System.out.print("Quanto deseja transferir?  \n");
            valor = Double.parseDouble(ler.nextLine());
            break;

        case "5":
            break;

        case "6":
            break;

        default:
            System.out.println("Opção inválida: " + num);
    }
}
2 curtidas

Bom dia @A.David, acredito que você esteja utilizando o Switch de forma incorreta, pois o mesmo é um estrutura de decisão e não repetição. Acredito que uma das formas de solucionar seu problema seria algo nesse estilo:

import java.util.Scanner;
    public class Main {

    	public static void main(String[] args) {
    		Scanner ler = new Scanner(System.in);
    		Banco c6Bank = new Banco();
    		String num = "0";
    		System.out.print("BEM VINDO AO C6 BANK!\n");
			while( num < "7")
			{
				System.out.print("1: Criar nova conta\n2: Depósito\n3: Saque\n3: Transferência\n4: Saldo\n6: Extrato\n7: Sair \nDigite aqui:");
				num = ler.next();

				switch(num) {
			
					case "1":
						System.out.print("Digite seu nome: ");		
						String nome = ler.next();
						Cliente cliente = new Cliente(nome);
						c6Bank.novaConta(cliente);
						System.out.print("\nSeja bem vindo(a) "+cliente.getNome()+ ", Sua conta foi criada\n");
						System.out.print("0: Voltar para o menu \n");
						break;
					case "2":
						
						System.out.println("Quanto deseja depositar? \n");
						double valor = ler.nextDouble();
						System.out.print("0: Voltar para o menu \n");
						break;
					case "3":
						System.out.println("Quanto deseja Sacar? \n");
						valor = ler.nextDouble();
						System.out.print("0: Voltar para o menu \n");
						break;
					case "4":
						System.out.print("Para quem deseja tranferir?  \n");
						nome = ler.next();
						System.out.print("Quanto deseja transferir?  \n");
						valor = ler.nextDouble();
						System.out.print("0: Voltar para o menu \n");
						break;
					case "5":
						System.out.print("0: Voltar para o menu \n");
						break;
					case "6": 
						System.out.print("0: Voltar para o menu \n");
						break;
				}
			}	
    	}
1 curtida

Muito obrigado!!
Realmente eu não sabia disso. Obrigado de verdade!

Muito obrigado, também!!
Me salvaram kkkk

Segue uma dica de leitura que pode ajudar :slight_smile:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

1 curtida

Para repetir operações, você tem que usar laços de repetição.
O switch é uma estrutura de seleção, não de repetição, entretanto você pode usar o switch para executar as operações específicas de acordo com uma opção selecionada.
O que você precisa fazer, é deixar seu switch dentro de um laço.

Exemplo:

import java.io.PrintStream;
import java.util.Scanner;

public class Main {

    private static final Scanner entrada = new Scanner(System.in);
    private static final PrintStream saida = System.out;

    private static final int SAIR = 0;
    private static final int NOVA_CONTA = 1;
    private static final int DEPOSITO = 2;
    private static final int SAQUE = 3;
    private static final int TRANSFERENCIA = 4;
    private static final int SALDO = 5;
    private static final int EXTRATO = 6;

    public static void main(String[] args) {
        Main programa = new Main();
        programa.executar();
    }

    private Banco c6Bank = new Banco();

    public void executar() {
        saida.print("BEM VINDO AO C6 BANK!\n");
        int opcao = SAIR;
        do {
            opcao = escolherOpcaoMenu();
            switch (opcao) {
                case NOVA_CONTA:
                    novaConta();
                    break;
                case DEPOSITO:
                    deposito();
                    break;
                case SAQUE:
                    saque();
                    break;
                case TRANSFERENCIA:
                    transferencia();
                    break;
                case SALDO:
                    saldo();
                    break;
                case EXTRATO:
                    extrato();
                    break;
            }
        } while (opcao != SAIR);
    }

    private void novaConta() {
        saida.print("Digite seu nome: ");
        String nome = entrada.nextLine();
        Cliente cliente = new Cliente(nome);
        c6Bank.novaConta(cliente);
        saida.print("\nSeja bem vindo(a) " + cliente.getNome() + ", Sua conta foi criada\n");
        saldo();
    }

    private void deposito() {
        saida.println("Quanto deseja depositar? \n");
        double valor = Double.parseDouble(entrada.nextLine());
        saldo();
    }

    private int escolherOpcaoMenu() {
        saida.print(NOVA_CONTA    + ": Criar nova conta\n"
                  + DEPOSITO      + ": Depósito\n"
                  + SAQUE         + ": Saque\n"
                  + TRANSFERENCIA + ": Transferência\n"
                  + SALDO         + ": Saldo\n"
                  + EXTRATO       + ": Extrato\n"
                  + SAIR          + ": Sair\n"
                  + "Digite aqui: ");
        return Integer.parseInt(entrada.nextLine());
    }

    private void extrato() {
        saida.print("Falta implementar");
    }

    private void saque() {
        saida.println("Quanto deseja Sacar? \n");
        double valor = Double.parseDouble(entrada.nextLine());
        saldo();
    }

    private void saldo() {
        saida.print("Falta implementar");
    }

    private void transferencia() {
        saida.print("Para quem deseja tranferir?  \n");
        String nome = entrada.nextLine();
        saida.print("Quanto deseja transferir?  \n");
        double valor = Double.parseDouble(entrada.nextLine());
        saldo();
    }
}
1 curtida

Eu tenho a seguinte classe principal:

import java.util.Scanner;
    public class Main {

    	public static void main(String[] args) {
    		Scanner ler = new Scanner(System.in);
    		Banco c6Bank = new Banco();
    		String num = "0";
    		int numero = 0;
            		
    		System.out.print("BEM VINDO AO C6 BANK!\n");
    		while (true) {
    		    System.out.print("1: Criar nova conta\n2: Dopósito\n3: Saque\n3: Transferência\n4: Saldo\n6: Extrato\n0 para sair\nDigite aqui:");
    		   num = ler.nextLine();
               numero ++;
    		    if ("0".equals(num))
    		        break;
    		    switch (num) {
    		        case "1":
    		            System.out.print("Digite seu nome: ");
    		            String nome = ler.nextLine();
    		            Cliente cliente = new Cliente(nome);
    		            c6Bank.novaConta(cliente);
    		            System.out.print("Seja bem vindo(a) " + cliente.getNome() + ", Sua conta foi criada\n");
    		            
    		            Conta c1 = c6Bank.getConta(numero);
    		            System.out.print("O seu número é: "+c1.getNumero());
    		            break;

    		        case "2":
    		            System.out.println("\nQuanto deseja depositar? ");
    		            double valor = ler.nextDouble();
    		            System.out.println("\nQual o número da conta? ");
    		            int numeroConta = ler.radix();
    		            c1.deposita(numeroConta, valor);
    		           break;

    		        case "3":
    		        	System.out.println("\nQual o número da conta? ");
    		            numeroConta = ler.radix();
    		        	System.out.println("\nQuanto deseja Sacar? ");
    		            valor = ler.nextDouble();
    		            c1.saca(numeroConta, valor);
    		            break;

    		        case "4":
    		        	System.out.print("\nQual o nome da conta à quem você quer transferir?  ");
    		        	String destino = ler.nextLine();
    		        	System.out.print("\nQual o número da sua conta?  ");
    		            numeroConta = ler.radix();
    		            System.out.println("\nQual o número da conta à quem você quer transferir?");
    		            int numeroDestino = ler.radix();
    		            System.out.print("\nQuanto deseja transferir?  ");
    		            valor = ler.nextDouble();
    		           
    		            break;

    		        case "5":
    		        	System.out.print("Qual o número da sua conta?  ");
    		            numeroConta = ler.radix();
    		            c1.getSaldo();
    		            break;

    		        case "6":
    		        	System.out.print("Qual o número da sua conta?  ");
    		            numeroConta = ler.radix();
    		            c1.getExtrato();
    		            
    		            break;

    		        default:
    		            System.out.println("Opção inválida. Digite uma opção disponível no menu");
    		    }
    		}
    			        
    		
    		
    		
    		
    		
    		
    		
    		
    		
    		
    		
    	/*	
    		Cliente cliente1 = new Cliente("Ambrósio");
    		Cliente cliente2 = new Cliente("Cusfosfó");
    		c6Bank.novaConta(cliente1);
    		c6Bank.novaConta(cliente2);
    		Conta c1 = c6Bank.getConta(1);
    		Conta c2 = c6Bank.getConta(2);
    		System.out.println(c1);
    		System.out.println(c2);
    		
    		
    		c1.deposita(100);
    		c2.deposita(100);
    		System.out.println(c1);
    		System.out.println(c2);	
    		c1.saca(50);
    		c2.saca(75);
    		System.out.println(c1);
    		c1.getExtrato();
    		System.out.println(c2);
    */		
    }
    }

Seguinte classe Conta:

import java.util.ArrayList;
public class Conta{
	private Cliente titular;
	private double saldo;
	private int numero;
	ArrayList <String> msg = new ArrayList<String>();
	
		Conta(int numero, Cliente titular){
		this.titular = titular;
		this.saldo = 0;
		this.numero = numero;
	}
	
	public boolean saca(int numeroConta, double valor) {
		if (this.getNumero() == numeroConta) {
		if (valor > 0 && valor <= this.saldo) {
			this.saldo -= valor;
			msg.add ("Sacado "+valor);
			return true;
		}
		}
		return false;
	}
	public boolean deposita(int numeroConta, double valor) {
		if (this.getNumero() == numeroConta) {
			if(valor >=1) {
			this.saldo += valor;
			msg.add ("Depositado "+valor);
			return true;
		}
		}
		return false;
	}
	private void sacarTransferencia(int valor){
		if (valor > 0 && valor <= this.saldo) {
			this.saldo -= valor;
		}
	}
	private void depositarTransferencia(int valor){
		if(valor >=1) {
			this.saldo += valor;
		}
	}
	public void transfere(int numRem, int numEmi, int valor) {
		if(this.sacarTransferencia(valor) && numRem.depositarTransferencia(valor)) {
	
		}else {
		
		}
	}
	
	public double getSaldo(){
		return this.saldo;
	}
	public Cliente getTitular() {
		return this.titular;		
	}
	public int getNumero() {
		return numero;
	}
	
	public String toString() {
		return String.valueOf(getTitular())+
				" | "+String.valueOf(getNumero())+
				" | "+ String.valueOf(getSaldo());
}
	public String getExtrato() {
		for (int i = 0; i<msg.size(); i++) {
		    System.out.println(msg.get(i));
		}
		return null;
		
	}
}

E, por fim, a seguinte classe Banco:

import java.util.ArrayList;
public class Banco {
	
	ArrayList<Conta> contas = new ArrayList<Conta>();
	
	public Conta novaConta(Cliente cliente) {
		int newNumero = this.contas.size() +1;
		Conta contaNova = new Conta(newNumero, cliente);
		this.contas.add(contaNova);
		return contaNova;
	}
	public Conta getConta(int numero){
		if (numero > 0 && numero <= this.contas.size()) {
			return this.contas.get(numero - 1);
		}
		return null;
	}
}

O que acontece: quando eu tento criar um objeto de Conta (linhas 34, 42, 60 e 66 da classe Principal), diz qua a variável não foi inicializada. mas eu criei um objeto (ou ao menos é o que eu penso ter feito) na linha 24. Eu ainda sou iniciante em Java. Espero que possam me ajudar com isso.
Mais uma dúvida: eu quero fazer tanto Depósito, quanto Saque e Transferências apenas usando numeroConta e valor como parâmetros. Mas que define o número da Conta, é Banco. Como chamo o Banco em Conta?
Obs.: Eu não quero a resposta, mas sim um norte para eu pode aprender de verdade.

Você tem que declarar sua variável c1 fora do case "1".

Outra coisa, quando você lê entrada de dados a partir do TECLADO, deveria usar somente o método nextLine()

Porque você está usando o método radix()?
Esse método retorna a base numérica do Scanner, o padrão é base 10.

1 curtida

Certo certo…
Obrigado!

Mas se eu colocar fora do case 1, como eu consigo pegar os dados informados pelo usuário?

Você nem se deu o trabalho de testar?

Você vai DECLARAR fora do switch
INICIALIZAR no case "1"
MANIPULAR nos outros case

// o que eu declaro aqui
switch (opcao) {
    case OPCAO_1 :
        // eu consigo acessar aqui
        break; 
    case OPCAO_2 : 
        // eu consigo acessar aqui
        break;
    case OPCAO_3 :
        // eu consigo acessar aqui
        break;
    case OPCAO_N :
        // eu consigo acessar aqui
        break;
}
1 curtida

Consegui resolver. O que eu fiz? Eu criei métodos em Banco que chama métodos presentes em conta Conta. Segue o código:

 import java.util.ArrayList;
            public class Banco {
	
	ArrayList<Conta> contas = new ArrayList<Conta>();
	
	public Conta novaConta(Cliente cliente) {
		int newNumero = this.contas.size() +1;
		Conta contaNova = new Conta(newNumero, cliente);
		this.contas.add(contaNova);
		return contaNova;
	}
	public Conta getConta(int numero){
		if (numero > 0 && numero <= this.contas.size()) {
			return this.contas.get(numero - 1);
		}
		return null;
	}
	int maxConta = this.contas.size();
	public void tranferir(int origem, double valor, int destino) {
				if (origem > 0 && origem <= maxConta && destino > 0 && destino <= maxConta) {
			int y = this.contas.size();
			for (int z = 1; z < y; z++ ) {
				if(z == origem) {
					Conta contaOrigem = this.contas.get(origem);
					contaOrigem.deposita(valor);
				}
				if(z == destino) {
					Conta contaDestino = this.contas.get(destino);
					contaDestino.deposita(valor);
					}
		}
	}
}
	public void sacar (int numeroConta, double valor) {
		if(numeroConta > 0 && numeroConta <= maxConta ) {
		Conta deSaque = this.contas.get(numeroConta);
		deSaque.saca(valor);
		}else {
			System.out.println("Numero de conta incorreto");
		}
	}
	public void depositar (int numeroConta, double valor) {
		if(numeroConta > 0 && numeroConta <= maxConta ) {
		Conta deDeposito = this.contas.get(numeroConta);
		deDeposito.saca(valor);
		}else {
			System.out.println("Numero de conta incorreto");
		}
	}
	public void pedeSaldo (int numeroConta) {
		if(numeroConta > 0 && numeroConta <= maxConta ) {
		Conta praSaldo = this.contas.get(numeroConta);
		praSaldo.getSaldo();
		}else {
			System.out.println("Numero de conta incorreto");
		}
	}
	public void pedeExtrato(int numeroConta) {
		if(numeroConta > 0 && numeroConta <= maxConta ) {
		Conta praExtrato = this.contas.get(numeroConta);
		praExtrato.getExtrato();
		}else {
			System.out.println("Numero de conta incorreto");
		}
	}
}

Daí eu consigo chamado os métodos de Conta normalmente.
Se isso for armengue, desculpas kkkk Eu ainda não consigo destituir boas práticas de armengues… Só procuro uma forma de fazer as coisa.
Enfim, eu consegui rodar o programa “de boa”. Exceto por um problema:
Crio uma conta. Aí funciona de boa.
Aparece nome (Ambrósio), número (11).
Crio uma segunda conta. Aparece nome (Cusfosfós) número (21). De onde sai esse 1? Já rodei todo o código atrás de algum erro ou incremento, mas não o encontrei.
Pelo o que você pode ver de código, consegue me apontar algum possível erro lógico?

Posta os fontes das suas classes, não temos como adivinhar sua implementação. :wink:

1 curtida
import java.util.Scanner;
public class Main {

public static void main(String[] args) {
	Scanner ler = new Scanner(System.in);
	Banco c6Bank = new Banco();
	
	
	System.out.print("BEM VINDO AO C6 BANK!\n");
	while (true) {
	    System.out.println("1: Criar nova conta\n2: Dopósito\n3: Saque\n4: transferência\n5: Saldo\n6: Extrato\n0 para sair\nDigite aqui:");
	    String num = ler.nextLine();
       
	   
	    switch (num) {
	    	case "0":
	    		break;
	        case "1":
	            System.out.print("Digite seu nome: ");
	            String nome = ler.nextLine();
	            Cliente cliente = new Cliente(nome);
	            Conta c1 = c6Bank.novaConta(cliente);
	            System.out.println("Seja bem vindo(a) " + cliente.getNome() + ", Sua conta foi criada");
	            System.out.println("O número da sua conta é: "+c1.getNumero());
	            break;

	        case "2":
	            System.out.println("\nQual o número da conta? ");
	            int numeroConta = ler.nextInt();
	            System.out.println("\nQuanto deseja depositar?");
	            double valor = ler.nextDouble();
	            c6Bank.depositar(numeroConta, valor);
	           break;

	        case "3":
	        	System.out.println("\nQual o número da conta? ");
	            int  numeroConta1 = ler.nextInt();
	        	System.out.println("\nQuanto deseja Sacar? ");
	            valor = ler.nextDouble();
	            c6Bank.sacar(numeroConta1, valor);
	            break;

	        case "4":
	        	System.out.print("\nQual o número da sua conta?  ");
	            int origem = ler.nextInt();
	            System.out.println("\nQual o número da conta à quem você quer transferir?");
	            int destino = ler.nextInt();
	            System.out.print("\nQuanto deseja transferir?  ");
	            double valor1 = ler.nextDouble();
	            c6Bank.tranferir(origem, valor1, destino);
	            break;

	        case "5":
	        	System.out.print("Qual o número da sua conta?  ");
	            c6Bank.pedeSaldo(ler.nextInt());
	            break;

	        case "6":
	        	System.out.print("Qual o número da sua conta?  ");
	            c6Bank.pedeExtrato(ler.nextInt());
	            
	            break;

	        default:
	            System.out.println("\nOpção inválida.\nDigite uma opção disponível no menu");
	    }
	}
		      			
}
}

Agora está com um problema. Quando eu chamo eu termino uma função do menu (ex.: criar uma conta), ele cai no break normal. Porém, cai no default e volta par o while novamente. Aí aparece duas vezes o menu e a mensagem “digite uma opção válida” (mensagem do default).