AULA 14 MÓDULO 4 exceções java ⏱ 55 min

Exceções no Mundo Real

Hierarquia de exceções. Checked vs Unchecked. Exceções customizadas com campos de domínio. try-with-resources. Exceções de rede com HttpClient.

CheckedUncheckedRuntimeExceptiontry-with-resourcesfinallyIOException

Hierarquia de exceções em Java

Java tem uma hierarquia de exceções. Entender a hierarquia define o que capturar e o que criar.

Throwable ├── Error ← JVM crash, OutOfMemoryError. Não trate. └── Exception ├── Checked ← IOException, SQLException. Compilador exige tratamento. └── RuntimeException ← Unchecked. NullPointerException, ClassCastException, etc.
💡
regra prática
Checked: situação recuperável externa (arquivo não encontrado, rede caída) — force o cliente a tratar. Unchecked: erro de programação (null, cast errado, índice inválido) — não force, corrija o código.

Exceções customizadas

Crie suas próprias exceções para erros de domínio. Dê nomes descritivos — a exceção é documentação do que pode dar errado.

1
extends RuntimeException — Para erros de lógica de negócio — não força o cliente a declarar throws
2
Mensagem clara — new SaldoInsuficienteException('Saldo R$100, tentou sacar R$200')
3
Constructor chain — Sempre chame super(mensagem) para que printStackTrace mostre a mensagem
4
Código de erro opcional — Um campo código permite tratar programaticamente sem parsear String

try-with-resources + API HTTP

Java fecha recursos automaticamente com try-with-resources. Essencial para Scanner, arquivos e conexões HTTP.

🌐
exceções de rede
Você está estudando TCP/IP em Redes de Computadores 1. HttpClient lança IOException quando o servidor não responde — isso é a camada de transporte falhando. try-with-resources garante que a conexão é fechada mesmo com falha.
java
// Exceções customizadas para domínio bancário
public class SaldoInsuficienteException extends RuntimeException {
    private final double saldoAtual, valorSolicitado;

    public SaldoInsuficienteException(double saldo, double valor) {
        super(String.format("Saldo R$%.2f insuficiente para saque de R$%.2f", saldo, valor));
        this.saldoAtual = saldo;
        this.valorSolicitado = valor;
    }
}

// Uso em ContaBancaria.sacar()
public void sacar(double valor) {
    if (valor <= 0)
        throw new IllegalArgumentException("Valor deve ser positivo");
    if (valor > saldo)
        throw new SaldoInsuficienteException(saldo, valor);
    saldo -= valor;
}

// try/catch/finally
try {
    conta.sacar(500.0);
} catch (SaldoInsuficienteException e) {
    System.out.println("Saque negado: " + e.getMessage());
} finally {
    System.out.println("Operação encerrada"); // sempre executa
}

// try-with-resources — Scanner fecha automaticamente
try (Scanner sc = new Scanner(new File("dados.txt"))) {
    while (sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }
} catch (FileNotFoundException e) {
    System.out.println("Arquivo não encontrado: " + e.getMessage());
} // Scanner.close() chamado automaticamente
quiz · aula 14
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Qual a diferença entre Checked e Unchecked exception?
QUESTÃO 02
Por que criar SaldoInsuficienteException em vez de usar Exception genérica?
QUESTÃO 03
Quando o bloco finally executa?
0/3