Esse tópico abrange a criação de exceções personalizadas e a combinação com recursos que implementam AutoCloseable, para que você possa controlar erros de maneira mais precisa e garantir o fechamento automático de recursos.
🧠 1. Criando Exceções Personalizadas
Em Java, você pode criar suas próprias exceções, extendendo a classe Exception (ou uma de suas subclasses, como RuntimeException para exceções não verificadas). Exceções personalizadas são úteis quando você deseja fornecer mais contexto sobre um erro específico no seu aplicativo.
Exemplo Básico: Exceção Personalizada
class MinhaExcecao extends Exception {
public MinhaExcecao(String mensagem) {
super(mensagem);
}
}
Agora, você pode lançar essa exceção no código:
public class TesteExcecao {
public static void main(String[] args) {
try {
throw new MinhaExcecao("Algo deu errado!");
} catch (MinhaExcecao e) {
System.out.println("Capturada: " + e.getMessage());
}
}
}
Exceções Não Verificadas (Unchecked Exceptions)
Se a exceção não for verificada (não for necessária na assinatura do método), você pode extender RuntimeException:
class ExcecaoNaoVerificada extends RuntimeException {
public ExcecaoNaoVerificada(String mensagem) {
super(mensagem);
}
}
Uso:
public class TesteExcecao {
public static void main(String[] args) {
throw new ExcecaoNaoVerificada("Erro não verificado!");
}
}
🧠 2. Implementando Auto-Closeable Resources
Quando você cria seus próprios recursos que precisam ser fechados, basta implementar a interface AutoCloseable (ou Closeable), garantindo que o recurso será fechado automaticamente no try-with-resources.
Exemplo de Recurso Customizado
class RecursoPersonalizado implements AutoCloseable {
public void executar() {
System.out.println("Executando recurso");
}
@Override
public void close() {
System.out.println("Fechando recurso");
}
}
Agora, podemos usar esse recurso em um bloco try-with-resources:
public class TesteRecurso {
public static void main(String[] args) {
try (RecursoPersonalizado recurso = new RecursoPersonalizado()) {
recurso.executar();
} catch (Exception e) {
e.printStackTrace();
}
}
}
🖨️ Saída:
Executando recurso
Fechando recurso
🧠 3. Combinando Exceções Personalizadas com Recursos Auto-Closeable
Agora, vamos combinar exceções personalizadas com recursos AutoCloseable. Aqui, vamos criar uma exceção específica para falhas ao utilizar nosso recurso.
Exemplo: Exceção ao Usar Recurso
class RecursoComFalha implements AutoCloseable {
public void usar() throws Exception {
System.out.println("Usando recurso...");
throw new MinhaExcecao("Falha ao usar o recurso");
}
@Override
public void close() {
System.out.println("Fechando recurso");
}
}
class MinhaExcecao extends Exception {
public MinhaExcecao(String mensagem) {
super(mensagem);
}
}
Agora, no try-with-resources:
public class TesteRecursoComExcecao {
public static void main(String[] args) {
try (RecursoComFalha recurso = new RecursoComFalha()) {
recurso.usar();
} catch (MinhaExcecao e) {
System.out.println("Exceção capturada: " + e.getMessage());
} catch (Exception e) {
System.out.println("Erro genérico: " + e.getMessage());
}
}
}
🖨️ Saída:
Usando recurso...
Exceção capturada: Falha ao usar o recurso
Fechando recurso
✅ Vantagens e Considerações
- Personalização: Com exceções personalizadas, você pode fornecer mais contexto e detalhamento sobre os erros que ocorrem.
- Encapsulamento: Ao usar
AutoCloseable, você pode garantir que recursos sejam fechados automaticamente, evitando vazamentos de memória e recursos. - Combinando Exceções e Recursos: A combinação de exceções personalizadas com recursos auto-fecháveis permite um código mais limpo e organizado, além de facilitar o tratamento adequado de falhas.
🧪 Quiz – 5 questões rápidas
1. Como você cria uma exceção personalizada em Java?
A) Estendendo RuntimeException
B) Estendendo Exception
C) Usando throw diretamente
D) Criando uma instância de Throwable
2. O que o método close() faz em um recurso auto-closeable?
A) Fecha a aplicação
B) Fecha o recurso para liberar memória
C) Lança uma exceção
D) Nada, é apenas uma convenção
3. Qual é o tipo de exceção gerada por um recurso auto-closeable se ocorrer um erro?
A) IOException
B) RuntimeException
C) Exception
D) AutoCloseableException
4. O que acontece se uma exceção for lançada dentro de um bloco try-with-resources?
A) O recurso não é fechado
B) O recurso é fechado normalmente
C) O código entra em loop infinito
D) O bloco catch não será executado
5. Em um try-with-resources, o que acontece se o método close() lançar uma exceção?
A) A exceção será ignorada
B) A exceção será tratada no catch final
C) A exceção será registrada, mas não afetará a execução
D) O programa vai falhar e parar de executar
✅ Gabarito Comentado
- A, B – Você cria uma exceção personalizada extendendo
ExceptionouRuntimeException. - B – O método
close()é responsável por liberar recursos, como memória e conexões. - C – Exceções de qualquer tipo podem ser geradas por um recurso, mas a maioria são
Exceptionou subclasses. - B – O recurso será fechado automaticamente, mesmo com exceção.
- B – Se uma exceção for lançada no
close(), ela é tratada nocatchfinal (caso haja).