O comando switch: fazendo escolhas em Java

O comando switch: fazendo escolhas em JavaNo artigo sobre o laço do ... while de nossa apostila online Java Progressivo, mostramos como criar um menu simples.
Porém, o Java possui um recurso específico para esse propósito, que nos permite optar por algo, dependendo do que tenhamos digitado, é o comando switch.





O comando SWITCH em Java


Colocamos várias opções e vários comandos dentro do comando switch, todas as possibilidades de nosso aplicativo ou todas as opções ou rumos que nossos programas possam tomar.

O switch vai funcionar como um interruptor, pois dependendo da entrada que você der a ele, ele vai acionar somente certo(s) comando(s) dentre os que você disponibilizou.

É como se você criasse um menu, ou cardápio, e com o switch você escolhesse o que vai querer.

Declaração e Sintaxe do comando switch

Em Java, usamos e declaramos o comando switch da seguinte maneira:
switch( opção )
{
    case opção1:
            comandos caso a opção 1 tenha sido escolhida
            break;
    
    case opção2:
            comandos caso a opção 2 tenha sido escolhida
            break;
    
    case opção3:
            comandos caso a opção 3 tenha sido escolhida
            break;
    
    default:
            comandos caso nenhuma das opções anteriores tenha sido escolhida
}

A variável 'opção' geralmente é um inteiro ou caractere (também pode ser byte ou short), que o usuário digita através da classe Scanner.
Se 'opção' receber 'opção1' como entrada, são os códigos contido na 'case opção1' que serão executados.
Se 'opção' receber 'opção2' como entrada, são os códigos contido na 'case opção2' que serão executados.
Se 'opção' receber 'opção3' como entrada, são os códigos contido na 'case opção3' que serão executados.
Se 'opção' receber qualquer outra coisa que não seja 'opção1', 'opção2' ou 'opção3', são os códigos contido em 'default' que serão executados.


Exemplo de uso:
Vamos criar uma calculadora que faz as operações básicas usando o comando switch.
É um aplicativo Java simples que recebe 3 dados: dois números e um caractere.
Esse caractere poderá ser '+', '-', '*' ou '/' , e representarão a operação matemática que você deseja realizar entre os números. Vejamos:


import java.util.Scanner;

public class switchTest {
    public static void main(String[] args) {
        float numero1, numero2;
        char operacao;
        Scanner entrada = new Scanner(System.in);
        
        System.out.print("Escolha sua operação [+ - * / ]: ");
        operacao = entrada.nextLine().charAt(0);
        
        System.out.print("Entre com o primeiro número: ");
        numero1 = entrada.nextFloat();
        System.out.print("Entre com o segundo número: ");
        numero2 = entrada.nextFloat();
        System.out.println();
        
        switch( operacao )
        {
            case '+':
                System.out.printf("%.2f + %.2f = %.2f", numero1, numero2, numero1 + numero2);
                break;        
                
            case '-':
                System.out.printf("%.2f - %.2f = %.2f", numero1, numero2, numero1 - numero2);
                break;
                
            case '*':
                System.out.printf("%.2f * %.2f = %.2f", numero1, numero2, numero1 * numero2);
                break;
                
            case '/':
                System.out.printf("%.2f / %.2f = %.2f", numero1, numero2, numero1 / numero2);
                break;
            
            default:
                System.out.printf("Você digitou uma operação inválida.");        
            
        }
        

    }
}



Caso a 'opção' seja um char, coloque entre aspas simples '', caso seja string coloque entre aspas duplas "" e caso seja um número, não é necessário colocar nenhum tipo de aspas.


O real funcionamento do comando switch: sem o comando break


Omiti, propositalmente, uma informação importante.
Só é realizado um 'case' de cada vez por conta do 'break' contido em cada comando dentro dos 'case'.

Na verdade, o switch seleciona o 'case' através da 'opção' e faz com que todos os 'case' a partir daquele sejam executados.
O exemplo a seguir ilustra o real funcionamento do comando switch em Java, experimente digitar a vogal 'a':


import java.util.Scanner;

public class switchTest2 {
    public static void main(String[] args) {
        char vogal;
        Scanner entrada = new Scanner(System.in);
        
        System.out.print("Digite uma vogal minúscula: ");
        vogal = entrada.nextLine().charAt(0);
        
        
        switch( vogal )
        {
            case 'a':
                System.out.println("Você está no case da vogal 'a'");
            case 'e':
                System.out.println("Você está no case da vogal 'e'");
            case 'i':
                System.out.println("Você está no case da vogal 'i'");
            case 'o':
                System.out.println("Você está no case da vogal 'o'");
            case 'u':
                System.out.println("Você está no case da vogal 'u'");
        
            default:
                System.out.println("Você não digitou uma vogal minúscula");        
            
        }
        

    }
}


Exemplo da utilidade do comando swich sem o break

Á priori parece ser estranho essa propriedade do comando switch 'rodar' rodos os cases.
Porém, isso é uma mão na roda e se bem utilizado, só vai nos ajudar. E caso não precise, simplesmente coloque um break.

Vamos pegar o exemplo passado e deixá-lo mais robusto, à prova de usuários que tentarão digitar as vogais maiúsculas.
É uma prática bem comum em Java, é essencial que aprenda:

import java.util.Scanner;

public class switchTest3 {
    public static void main(String[] args) {
        char vogal;
        Scanner entrada = new Scanner(System.in);
        
        System.out.print("Digite uma vogal: ");
        vogal = entrada.nextLine().charAt(0);
        
        
        switch( vogal )
        {
            case 'a': case 'A':
                System.out.println("Você digitou 'a' ou 'A' ");
                break;
            
            case 'e': case 'E':
                System.out.println("Você digitou 'e' ou 'E' ");
                break;
                
            case 'i': case 'I':
                System.out.println("Você digitou 'i' ou 'I' ");
                break;
                
            case 'o': case 'O':
                System.out.println("Você digitou 'o' ou 'O' ");
                break;
                
            case 'u': case 'U':
                System.out.println("Você digitou 'u' ou 'U' ");
                break;

            default:
                System.out.println("Você não digitou uma vogal !");
            
        }
        

    }
}


Note que estamos acumulando os case minúsculos e maiúsculos de cada vogal para gerarem o mesmo comando. Essa é a prática comum. No caso, o comando é print.

Mais um exemplo útil do comando switch sem o break

Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial.
Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3% etc.
Vamos supor que você pode atrasar, no máximo, 5 meses.

O programa pede, como entrada, dois valores:
- um float: com o valor de sua dívida inicial (valor_i)
- um inteiro: de 0 até 5, que são os meses de atraso.

Nosso programa ficaria assim:

import java.util.Scanner;

public class switchTest4 {
    public static void main(String[] args) {
        float valor_i, valor_f, juros=0;
        int meses;
        Scanner entrada = new Scanner(System.in);
        
        System.out.print("Qual o valor inicial da dívida: ");
        valor_i = entrada.nextFloat();
        
        System.out.print("Você vai atrasar quantos meses [0-5]?: ");
        meses = entrada.nextInt();
        
        switch( meses )
        {
            case 5:
                juros++;
            case 4:
                juros++;
            case 3:
                juros++;
            case 2:
                juros++;
            case 1:
                juros++;
                break;
            default:
                System.out.println("Você não digitou um valor válido de meses");
            
        }
        System.out.println("Juros: "+juros+"%");
        valor_f=( (1 + (juros/100))*valor_i);
        System.out.printf("Valor final da dívida: R$ %.2f", valor_f);

    }
}


Se cair no case 5, vai contar todos os case, até o break, somando juros=5
Se cair no case 4, vai contar todos os case, até o break, somando juros=4
Assim, analogamente, para case 3, 2 e case 1.

Ou seja, nós utilizamos o fato dos case irem se acumulando.

Exercício:
Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês.
Use switch e não use break. Acumule os case.
Solução

Dicas e Novidades de Java por e-mail

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.