Da trilha de Java Este conceito ainda não saiu como card do dia. ir para o card de hoje

Java Erros Intermediário

Exceções

Em Java, exceções representam erros em tempo de execução. Elas são divididas em checked (verificadas em tempo de compilação) e unchecked (não verificadas). Exceções checked herdam de Exception (mas não de RuntimeException) e obrigam o programador a tratá-las ou declará-las com throws. Já as unchecked herdam de RuntimeException e geralmente indicam erros de lógica, como NullPointerException.

O bloco try delimita o código que pode lançar exceções. O catch captura e trata exceções específicas. O finally é executado sempre, independentemente de ocorrer exceção ou não, sendo ideal para liberar recursos.

A palavra-chave throw lança uma exceção explicitamente, enquanto throws na assinatura do método informa que ele pode propagar exceções checked. Você também pode criar suas próprias exceções estendendo Exception (checked) ou RuntimeException (unchecked).

Neste card, você verá como usar try, catch, finally, throw, throws e como definir exceções personalizadas.

Pontos-chave

  • Exceções checked são verificadas em tempo de compilação e devem ser tratadas ou declaradas com throws.
  • Exceções unchecked herdam de RuntimeException e não exigem tratamento obrigatório.
  • O bloco finally sempre executa, mesmo que ocorra uma exceção ou um return dentro do try.
  • throw lança uma exceção; throws declara que um método pode lançar exceções checked.
  • Você pode criar exceções próprias estendendo Exception (checked) ou RuntimeException (unchecked).
ExcecoesDemo.java
// Demonstração de try/catch/finally, throw, throws e exceção personalizada
public class ExcecoesDemo {
    // Exceção personalizada checked
    static class SaldoInsuficienteException extends Exception {
        public SaldoInsuficienteException(String mensagem) {
            super(mensagem);
        }
    }

    static double sacar(double saldo, double valor) throws SaldoInsuficienteException {
        if (valor > saldo) {
            throw new SaldoInsuficienteException("Saldo insuficiente: " + saldo);
        }
        return saldo - valor;
    }

    public static void main(String[] args) {
        double saldo = 100.0;
        try {
            System.out.println("Tentando sacar 150...");
            saldo = sacar(saldo, 150.0); // lança exceção
            System.out.println("Novo saldo: " + saldo);
        } catch (SaldoInsuficienteException e) {
            System.out.println("Erro: " + e.getMessage());
        } finally {
            System.out.println("Operação finalizada. Saldo atual: " + saldo);
        }

        // Exemplo de unchecked (divisão por zero)
        try {
            int resultado = 10 / 0;
            System.out.println(resultado);
        } catch (ArithmeticException e) {
            System.out.println("Erro aritmético: " + e.getMessage());
        }
    }
}

Exercícios

  1. 1
    Fácil

    Tratando divisão por zero

    Escreva um programa que leia dois números inteiros e realize a divisão do primeiro pelo segundo. Use try/catch para tratar a exceção ArithmeticException caso o divisor seja zero. Exiba o resultado ou uma mensagem de erro.

    Resolver
  2. 2
    Médio

    Validação de idade com exceção personalizada

    Crie uma exceção personalizada IdadeInvalidaException (checked) que represente idade fora do intervalo permitido (0 a 150). Escreva um método validarIdade(int idade) que lance essa exceção se a idade for inválida. No main, leia uma idade e trate a exceção, exibindo a mensagem de erro.

    Resolver
  3. 3
    Desafio

    Sistema bancário com múltiplas exceções e finally

    Implemente um sistema bancário simples com operações de depósito e saque. Crie duas exceções personalizadas: SaldoInsuficienteException (checked) e ValorInvalidoException (unchecked). O método sacar deve lançar SaldoInsuficienteException se o valor for maior que o saldo, e ValorInvalidoException se o valor for negativo ou zero. O método depositar deve lançar ValorInvalidoException para valores não positivos. No main, realize uma sequência de operações e use try/catch/finally para tratar erros e exibir o saldo final.

    Resolver

Continue estudando