AFF Education Construa seu Futuro

Aula 40 - condição if-else

Revisão da Instrução if

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.

Anatomia Detalhada da Instrução if

Condição
↓ verdadeira     falsa ↘
Bloco de código
      ↓
Continua a execução

Exemplo Básico de if

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.

Instrução if-else

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.

Instrução if-else if-else

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.

if Aninhado

É 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.

Expressões Booleanas Complexas

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:

Avaliação de Curto-Circuito

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.

Boas Práticas com if

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

Uso avançado com métodos

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:

Exercícios

Teste seus conhecimentos sobre a instrução if em Java:

1. Qual operador é utilizado para comparar se dois valores são iguais em uma condição if?

2. O que ocorre com o código a seguir?

if (x > 10)
    System.out.println("x é maior que 10");
    System.out.println("x foi verificado");

3. Qual é o resultado da avaliação de curto-circuito em Java?

4. Qual é a forma mais concisa de escrever a seguinte estrutura condicional?

String resultado;
if (idade >= 18) {
    resultado = "Maior de idade";
} else {
    resultado = "Menor de idade";
}

5. Complete o código para verificar se um ano é bissexto:

public static boolean ehAnoBissexto(int ano) {
    // Um ano é bissexto se for divisível por 4 e não for divisível por 100,
    // ou se for divisível por 400
    return __________________________________________;
}

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Para verificar se idade >= 18 imprimindo "maior" ou "menor", com idade = 16, a saída é:

2. Qual a saída de int x = 10; if (x % 2 == 0) System.out.println("par"); else System.out.println("ímpar");?