A instrução if é uma estrutura de controle fundamental em Java que permite a execução condicional de blocos de código. Nesta aula, vamos revisar e aprofundar o uso da instrução if, explorando suas variações e casos de uso.
Sintaxe básica da instrução if:
if (condição) {
// bloco de código executado se a condição for verdadeira
}
A instrução if avalia uma expressão booleana (condição) e, se for verdadeira, executa o bloco de código associado.
public class ExemploIf {
public static void main(String[] args) {
int idade = 18;
// Verificando se a pessoa é maior de idade
if (idade >= 18) {
System.out.println("Pessoa é maior de idade.");
System.out.println("Pode tirar carteira de motorista.");
}
System.out.println("Verificação de idade concluída.");
// Exemplo com uma única instrução (sem chaves)
int temperatura = 30;
if (temperatura > 25)
System.out.println("Está calor hoje!");
// Esta linha será executada independentemente da condição acima
System.out.println("Verificação de temperatura concluída.");
}
}
Pessoa é maior de idade.
Pode tirar carteira de motorista.
Verificação de idade concluída.
Está calor hoje!
Verificação de temperatura concluída.
Atenção: Quando o bloco if contém apenas uma instrução, as chaves são opcionais. No entanto, é uma boa prática sempre usar chaves para evitar erros e melhorar a legibilidade.
A estrutura if-else permite executar um bloco de código quando a condição é verdadeira e outro bloco quando é falsa:
public class ExemploIfElse {
public static void main(String[] args) {
int idade = 16;
// Verificando se a pessoa é maior de idade
if (idade >= 18) {
System.out.println("Pessoa é maior de idade.");
System.out.println("Pode tirar carteira de motorista.");
} else {
System.out.println("Pessoa é menor de idade.");
System.out.println("Não pode tirar carteira de motorista ainda.");
}
// Exemplo com operador ternário (forma compacta de if-else)
String status = (idade >= 18) ? "maior de idade" : "menor de idade";
System.out.println("Status: " + status);
// Verificando se um número é par ou ímpar
int numero = 7;
if (numero % 2 == 0) {
System.out.println(numero + " é um número par.");
} else {
System.out.println(numero + " é um número ímpar.");
}
}
}
Pessoa é menor de idade.
Não pode tirar carteira de motorista ainda.
Status: menor de idade
7 é um número ímpar.
Operador Ternário: A expressão (condição) ? valor_se_verdadeiro : valor_se_falso é uma forma compacta de escrever um if-else simples, útil para atribuições condicionais.
Quando precisamos verificar múltiplas condições em sequência, usamos a estrutura if-else if-else:
public class ExemploIfElseIf {
public static void main(String[] args) {
int nota = 85;
// Classificando a nota
if (nota >= 90) {
System.out.println("Nota A - Excelente");
} else if (nota >= 80) {
System.out.println("Nota B - Muito bom");
} else if (nota >= 70) {
System.out.println("Nota C - Bom");
} else if (nota >= 60) {
System.out.println("Nota D - Regular");
} else {
System.out.println("Nota F - Reprovado");
}
// Verificando faixa etária
int idade = 25;
if (idade < 12) {
System.out.println("Criança");
} else if (idade < 18) {
System.out.println("Adolescente");
} else if (idade < 60) {
System.out.println("Adulto");
} else {
System.out.println("Idoso");
}
}
}
Nota B - Muito bom
Adulto
Observação: Na estrutura if-else if-else, as condições são verificadas em ordem. Assim que uma condição verdadeira é encontrada, o bloco correspondente é executado e as demais condições são ignoradas.
É possível ter uma instrução if dentro de outra, criando estruturas de decisão aninhadas:
public class IfAninhado {
public static void main(String[] args) {
int idade = 20;
boolean temCarteira = true;
// Verificando se pode dirigir
if (idade >= 18) {
System.out.println("Tem idade suficiente para dirigir.");
if (temCarteira) {
System.out.println("Possui carteira de motorista. Pode dirigir!");
} else {
System.out.println("Não possui carteira de motorista. Não pode dirigir!");
}
} else {
System.out.println("Não tem idade suficiente para dirigir.");
}
// Exemplo com múltiplos níveis de aninhamento
double saldo = 1500.0;
boolean contaAtiva = true;
boolean limiteDisponivel = true;
if (contaAtiva) {
System.out.println("Conta está ativa.");
if (saldo > 0) {
System.out.println("Saldo positivo de R$ " + saldo);
if (limiteDisponivel) {
System.out.println("Limite de crédito disponível.");
} else {
System.out.println("Sem limite de crédito disponível.");
}
} else {
System.out.println("Saldo negativo ou zerado: R$ " + saldo);
}
} else {
System.out.println("Conta inativa. Operações não permitidas.");
}
}
}
Tem idade suficiente para dirigir.
Possui carteira de motorista. Pode dirigir!
Conta está ativa.
Saldo positivo de R$ 1500.0
Limite de crédito disponível.
Cuidado: Muitos níveis de aninhamento podem tornar o código difícil de ler e manter. Considere refatorar o código ou usar abordagens alternativas quando o aninhamento se torna excessivo.
As condições em uma instrução if podem ser expressões booleanas complexas, combinando múltiplas verificações com operadores lógicos:
public class CondicoesComplexas {
public static void main(String[] args) {
int idade = 25;
double altura = 1.75;
boolean temProblemaCardiaco = false;
// Verificando se a pessoa pode participar de uma montanha-russa
// Condição: idade entre 12 e 65 anos, altura mínima de 1.40m e sem problemas cardíacos
if (idade >= 12 && idade <= 65 && altura >= 1.40 && !temProblemaCardiaco) {
System.out.println("Pode participar da montanha-russa.");
} else {
System.out.println("Não pode participar da montanha-russa.");
// Verificando o motivo da restrição
if (idade < 12 || idade > 65) {
System.out.println("Motivo: Idade fora da faixa permitida (12-65 anos).");
}
if (altura < 1.40) {
System.out.println("Motivo: Altura inferior ao mínimo exigido (1.40m).");
}
if (temProblemaCardiaco) {
System.out.println("Motivo: Possui problema cardíaco.");
}
}
// Exemplo com o operador OR (||)
boolean feriado = false;
boolean fimDeSemana = true;
if (feriado || fimDeSemana) {
System.out.println("Dia de descanso!");
} else {
System.out.println("Dia de trabalho!");
}
}
}
Pode participar da montanha-russa.
Dia de descanso!
Operadores lógicos:
Java utiliza avaliação de curto-circuito para operadores lógicos && e ||, o que significa que o segundo operando só é avaliado se necessário:
public class AvaliacaoCurtoCircuito {
public static void main(String[] args) {
int a = 5;
int b = 10;
// Usando &&: o segundo operando só é avaliado se o primeiro for verdadeiro
if (a > 0 && b / a > 1) {
System.out.println("Condição && verdadeira");
}
// Se a fosse 0, o segundo operando (b / a) não seria avaliado,
// evitando assim um erro de divisão por zero
// Usando ||: o segundo operando só é avaliado se o primeiro for falso
if (a > 10 || b > 5) {
System.out.println("Condição || verdadeira");
}
// Exemplo onde o curto-circuito evita um erro
String texto = null;
// Verificando se texto não é nulo antes de chamar um método sobre ele
if (texto != null && texto.length() > 5) {
System.out.println("Texto válido e longo");
} else {
System.out.println("Texto inválido ou curto");
}
// Se não usássemos o curto-circuito, a expressão texto.length() causaria um NullPointerException
}
}
Condição && verdadeira
Condição || verdadeira
Texto inválido ou curto
Dica: A avaliação de curto-circuito é particularmente útil para evitar erros como divisão por zero ou NullPointerException, colocando as verificações de segurança como primeiro operando.
public class BoasPraticasIf {
public static void main(String[] args) {
int idade = 18;
// Ruim: sem chaves
if (idade >= 18)
System.out.println("Maior de idade");
// Bom: com chaves
if (idade >= 18) {
System.out.println("Maior de idade");
}
// Ruim: condição complexa diretamente no if
if (idade > 0 && idade < 12 || idade >= 65 && idade <= 100) {
System.out.println("Preço com desconto");
}
// Bom: extraindo condições para variáveis com nomes significativos
boolean ehCrianca = idade > 0 && idade < 12;
boolean ehIdoso = idade >= 65 && idade <= 100;
if (ehCrianca || ehIdoso) {
System.out.println("Preço com desconto");
}
// Ruim: aninhamento excessivo
if (idade >= 18) {
if (idade < 65) {
if (idade % 2 == 0) {
System.out.println("Adulto com idade par");
}
}
}
// Bom: reduzindo aninhamento com condições combinadas
if (idade >= 18 && idade < 65 && idade % 2 == 0) {
System.out.println("Adulto com idade par");
}
// Ruim: if-else para atribuição simples
String categoria;
if (idade < 18) {
categoria = "Jovem";
} else {
categoria = "Adulto";
}
// Bom: usando operador ternário para atribuição simples
String categoriaOptimizada = (idade < 18) ? "Jovem" : "Adulto";
System.out.println("Categoria: " + categoriaOptimizada);
}
}
Maior de idade
Maior de idade
Adulto com idade par
Categoria: Adulto
Podemos combinar instruções if com métodos para criar código mais modular e legível:
public class IfComMetodos {
public static void main(String[] args) {
int idade = 25;
double altura = 1.75;
boolean temProblemaCardiaco = false;
// Verificando elegibilidade para montanha-russa usando método
if (podeParticiparMontagaRussa(idade, altura, temProblemaCardiaco)) {
System.out.println("Pode participar da montanha-russa!");
} else {
System.out.println("Não pode participar da montanha-russa.");
exibirMotivos(idade, altura, temProblemaCardiaco);
}
// Verificando categoria por faixa etária
System.out.println("Categoria: " + categoriaPorIdade(idade));
}
// Método que encapsula a lógica de verificação
public static boolean podeParticiparMontagaRussa(int idade, double altura, boolean temProblemaCardiaco) {
return idade >= 12 && idade <= 65 && altura >= 1.40 && !temProblemaCardiaco;
}
// Método que exibe os motivos da restrição
public static void exibirMotivos(int idade, double altura, boolean temProblemaCardiaco) {
if (idade < 12 || idade > 65) {
System.out.println("- Idade fora da faixa permitida (12-65 anos).");
}
if (altura < 1.40) {
System.out.println("- Altura inferior ao mínimo exigido (1.40m).");
}
if (temProblemaCardiaco) {
System.out.println("- Possui problema cardíaco.");
}
}
// Método que retorna a categoria por faixa etária
public static String categoriaPorIdade(int idade) {
if (idade < 12) {
return "Criança";
} else if (idade < 18) {
return "Adolescente";
} else if (idade < 60) {
return "Adulto";
} else {
return "Idoso";
}
}
}
Pode participar da montanha-russa!
Categoria: Adulto
Vantagens de extrair a lógica condicional para métodos:
Teste seus conhecimentos sobre a instrução if em Java:
Reforce o conteúdo desta aula com mais dois exercícios práticos: