Menu

Comando switch em Java: casos, fall-through e sintaxe de seta

O comando switch do Java explicado: rótulos case, break e fall-through, o ramo default, agrupamento de casos, a forma moderna com seta e as expressões switch.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Para que serve o switch

Um switch compara um valor com uma lista de opções fixas e executa o ramo que corresponde. Quando você se pega escrevendo uma longa cadeia if/else if que continua testando a mesma variável contra diferentes constantes, um switch diz a mesma coisa com mais clareza.

Ele só faz verificações de igualdade contra constantes de tempo de compilação: não pode testar intervalos nem combinar condições. Para isso, fique com if/else.

O comando switch clássico

A forma tradicional usa rótulos case com dois-pontos e um break depois de cada ramo:

O Java avalia day, salta para o case correspondente, executa suas instruções, e o break sai do switch. O ramo default é executado quando nada mais corresponde: pense nele como o else. Ele é opcional, mas incluí-lo é uma boa prática para que valores inesperados não passem despercebidos em silêncio.

A armadilha do break: o fall-through

Este é o erro de switch mais comum de todos. Se você omite um break, a execução não para no fim de um case correspondente: ela cai no case seguinte e continua executando até encontrar um break ou a chave de fechamento:

Você poderia esperar apenas Level 1, mas isto imprime as três linhas. Como o case 1 não tem break, o controle desliza direto para case 2 e case 3. Sempre adicione break, a menos que você realmente queira o fall-through, e quando depender dele, deixe um comentário para que o próximo leitor saiba que foi intencional.

Agrupando casos

O fall-through tem um uso legítimo e organizado: empilhar rótulos case para que vários valores compartilhem um mesmo bloco. Coloque os rótulos um após o outro, sem código entre eles:

Aqui 'A', 'B' e 'C' executam todos a mesma linha "Pass". Esta é a forma prevista de dizer "qualquer um destes valores faz a mesma coisa".

switch com Strings

Você não está limitado a números. Desde o Java 7 você pode usar switch com um String, o que é perfeito para escolhas de menu ou nomes de comandos:

A comparação diferencia maiúsculas de minúsculas: "Stop" não corresponderia a "stop", então normalize primeiro (por exemplo, command.toLowerCase()) se a capitalização da entrada variar. Mais uma pegadinha: se command for null, o switch lança uma NullPointerException, então proteja-se contra null antes de chegar nele.

A moderna sintaxe de seta

O Java mais recente (14+) acrescenta uma forma com seta, case label -> ..., que corrige por design a armadilha do fall-through. Cada case de seta executa exatamente um ramo e nunca cai, então não há nenhum break para esquecer:

Repare que você agrupa valores com uma vírgula (case 6, 7) em vez de empilhar rótulos, e não há um único break à vista. Para múltiplas instruções, use um bloco: case 1 -> { ...; ... }. Prefira esta forma em código novo: ela é mais curta e elimina toda uma classe de erros.

switch como expressão

A forma com seta também pode produzir um valor. Uma expressão switch retorna um resultado que você pode atribuir diretamente a uma variável: sem variável temporária, sem atribuição repetida em cada ramo:

Todo o switch (...) { ... } é avaliado para um número armazenado em days. Note o ponto e vírgula depois da chave de fechamento: ele faz parte da instrução de atribuição. Uma expressão switch precisa ser exaustiva (cobrir todos os valores possíveis), e é por isso que o default está aqui. Se um ramo precisa de várias instruções antes de retornar um valor, use um bloco com yield:

case 2 -> {
    boolean leap = (year % 4 == 0);
    yield leap ? 29 : 28;
}

O yield é a forma como um bloco de seta devolve seu valor, o equivalente, no mundo das expressões, ao break que carrega um resultado.

Próximo: laços for

O switch escolhe um ramo entre muitos; às vezes, em vez disso, você precisa repetir um bloco muitas vezes. O laço for executa código um número controlado de vezes (percorrendo um intervalo ou passando por cada item) e é a próxima página.

Perguntas frequentes

Quando devo usar switch em vez de if-else em Java?

Use switch quando você está comparando um valor com muitas opções fixas e constantes, como o número de um dia, uma escolha de menu ou um enum. Ele se lê com mais clareza do que uma longa cadeia if/else if e transmite a ideia de "escolha um ramo entre estes valores conhecidos". Fique com if/else quando suas condições envolvem intervalos (x > 10), várias variáveis ou qualquer coisa que não seja uma simples verificação de igualdade contra uma constante.

Por que preciso do break em um comando switch em Java?

Na sintaxe clássica com dois-pontos, assim que um case corresponde, a execução cai nos casos seguintes até encontrar um break ou o fim do switch. O break interrompe isso. Esquecê-lo é um erro clássico: você corresponde ao case 1: e acidentalmente executa também o código de case 2:, case 3:, e assim por diante. A sintaxe de seta mais recente (case 1 -> ...) nunca cai, então você não escreve break de jeito nenhum.

Um comando switch em Java pode funcionar com Strings?

Sim. Desde o Java 7 você pode usar switch com um String, e também pode usá-lo com int, char, byte, short, seus tipos wrapper e valores enum. Você não pode usar switch com long, double, float ou boolean. A comparação de strings diferencia maiúsculas de minúsculas, então "Yes" e "yes" são casos diferentes.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR