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
RuntimeExceptione não exigem tratamento obrigatório. - O bloco
finallysempre executa, mesmo que ocorra uma exceção ou umreturndentro dotry. throwlança uma exceção;throwsdeclara que um método pode lançar exceções checked.- Você pode criar exceções próprias estendendo
Exception(checked) ouRuntimeException(unchecked).
// 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());
}
}
}