Menu

if-else em Java: instruções condicionais com exemplos

Como tomar decisões em Java com if, else if e else: condições booleanas, encadeamento de ramos, aninhamento, o operador ternário e os erros comuns que confundem as pessoas.

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

Tomando decisões com if

Os programas precisam reagir aos dados: aprovado ou reprovado, em estoque ou esgotado, válido ou não. A instrução if é como o Java escolhe qual código executar com base em uma condição.

Um if recebe uma condição booleana entre parênteses e executa o bloco entre chaves apenas quando essa condição é true:

A condição score >= 60 é true, então a mensagem é exibida. A linha após a chave de fechamento sempre é executada: ela está fora do if. Mude score para 40 e a linha de "passed" é totalmente ignorada.

Diferente do C, o Java não deixa você colocar um número onde se espera um booleano. if (score) é um erro de compilação: a condição precisa ser uma expressão boolean real, construída a partir de comparações (>, >=, ==, !=) ou lógica booleana (&&, ||, !).

Adicionando um else

else oferece o caminho "caso contrário": código que executa apenas quando a condição é false:

Exatamente um dos dois blocos é executado: nunca os dois, nunca nenhum. O else não tem condição própria; ele simplesmente captura tudo o que o if não pegou.

Encadeando com else if

Quando há mais de dois resultados, encadeie condições com else if. O Java as verifica de cima para baixo e executa o primeiro bloco cuja condição é verdadeira, e então ignora o resto:

A ordem importa. Como 84 é verificado primeiro contra >= 90 (falso) e depois contra >= 80 (verdadeiro), ele para em B e nem chega a testar os limites inferiores. É por isso também que você não precisa escrever score >= 80 && score < 90: alcançar o segundo ramo já garante que score era menor que 90. Coloque primeiro a condição mais restrita ou de maior prioridade.

O else final é o seu caso geral. Omiti-lo aqui seria um erro de compilação, já que grade poderia ficar sem atribuição na hora de imprimi-la.

Comparando valores: == versus equals()

O erro mais comum com if em Java é comparar strings com ==. Para primitivos (int, double, char, boolean), == está correto. Para objetos, == pergunta "é o mesmo objeto na memória?", enquanto .equals() pergunta "eles têm o mesmo conteúdo?", e quase sempre você quer o segundo:

Apenas a segunda mensagem é exibida. O new String("yes") é um objeto diferente do literal "yes", então == é false, mas o texto é idêntico, então .equals() é true. Regra geral: primitivos usam ==, objetos usam .equals().

Um truque seguro para evitar uma NullPointerException quando a variável pode ser null: coloque o literal primeiro, if ("yes".equals(input)), já que um literal nunca é null.

Combinando e aninhando condições

Você pode combinar condições com && (e), || (ou) e ! (não), ou aninhar um if dentro de outro quando uma verificação só faz sentido depois de uma anterior passar:

&& e || fazem curto-circuito: em a && b, se a for falso o Java nunca avalia b. Isso é útil para se proteger de erros: if (s != null && s.length() > 0) é seguro porque a verificação de comprimento é ignorada quando s é null. Prefira combinar com && em vez de aninhar profundamente quando puder; o código plano lê-se com mais clareza do que uma pirâmide de chaves.

Uma armadilha clássica: um único = é atribuição, == é comparação. Escrever if (x = 5) é um erro de compilação para int (ótimo), mas if (flag = true) em um boolean compila e atribui silenciosamente: fique atento a isso.

O operador ternário

Quando tudo o que você quer é escolher entre dois valores, o operador ternário ?: é um compacto de uma linha. Leia condition ? a : b como "se a condição então a senão b":

O ternário produz um valor que você pode atribuir ou passar diretamente. Reserve-o para seleção simples: se algum ramo precisa de várias instruções ou de lógica de verdade, um if-else completo continua legível onde um ternário aninhado rapidamente vira um quebra-cabeça.

Uma armadilha: as chaves opcionais

O Java deixa você omitir as chaves quando um ramo tem uma única instrução, mas isso convida a um bug sutil. A indentação engana:

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

Apenas a primeira linha é controlada pelo if; a segunda sempre executa, não importa o quê, apesar de a indentação sugerir o contrário. Use sempre chaves, mesmo para uma única linha, e toda essa categoria de erro desaparece.

Próximo: switch

As cadeias if-else if são perfeitas quando cada ramo testa uma condição diferente. Mas quando você está comparando um único valor com muitas possibilidades fixas (um nome de dia, uma opção de menu, um enum), uma longa escada de else if fica repetitiva. A instrução switch foi feita exatamente para isso, e é a próxima página.

Perguntas frequentes

Como escrever uma instrução if-else em Java?

Coloque uma condição booleana entre parênteses depois de if, depois o código a executar entre chaves e um bloco else opcional para quando a condição for falsa: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. A condição precisa resultar em um boolean: o Java não aceita um int como o C faz.

Qual é a diferença entre == e equals() em uma instrução if do Java?

== verifica se duas referências apontam para o mesmo objeto, enquanto .equals() compara o conteúdo. Para primitivos como int, use ==. Para objetos, especialmente String, use .equals(): if (name.equals("Sam")), e não if (name == "Sam"). Usar == com strings é o erro mais comum com if em Java.

O que é o operador ternário em Java?

O operador ternário condition ? valueIfTrue : valueIfFalse é um if-else compacto que produz um valor. Por exemplo, String label = age >= 18 ? "adult" : "minor"; atribui um de dois valores conforme a condição. Use-o para seleção simples de valores; recorra a um if-else completo quando houver lógica a executar em cada ramo.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR