Exceptions
try, catch, finally e hierarquia de erros
Exceções em Java são eventos que interrompem o fluxo normal de execução. O mecanismo try/catch/finally permite capturá-las e tratá-las de forma estruturada. O bloco try executa o código arriscado, catch captura tipos específicos de exceção, e finally sempre executa — seja com exceção ou sem.
Exceções se dividem em dois grupos: Checked exceptions (herdam de Exception diretamente, como IOException e SQLException) forçam o programador a tratar ou declarar com throws — o compilador verifica. Unchecked exceptions (herdam de RuntimeException, como NullPointerException e IndexOutOfBoundsException) são opcionais de tratar.
Crie exceções personalizadas estendendo Exception (checked) ou RuntimeException (unchecked). O Java 7 trouxe try-with-resources que fecha automaticamente qualquer objeto AutoCloseable ao sair do bloco.
// ── Exceção customizada ───────────────────────────
public class SaldoInsuficienteException extends RuntimeException {
public SaldoInsuficienteException(double saldo, double valor) {
super(String.format(
"Saldo %.2f insuficiente para operação de %.2f",
saldo, valor));
}
}
// ── Try-with-resources (Java 7+) ─────────────────
try (BufferedReader br = new BufferedReader(
new FileReader("dados.txt"))) {
String linha;
while ((linha = br.readLine()) != null) {
System.out.println(linha);
}
} catch (FileNotFoundException e) {
System.err.println("Arquivo não encontrado: " + e.getMessage());
} catch (IOException e) {
System.err.println("Erro de leitura: " + e.getMessage());
}
// br.close() é chamado automaticamente!
// ── Lançando exceções manualmente ─────────────────
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;
}Nunca capture Exception ou Throwable genérico sem re-lançar. Capture apenas o tipo específico que você sabe tratar. Logar e engolir exceções silenciosamente é um dos piores antipatterns.