✅ Create Custom Exceptions and Auto-Closeable Resources

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

  1. Personalização: Com exceções personalizadas, você pode fornecer mais contexto e detalhamento sobre os erros que ocorrem.
  2. Encapsulamento: Ao usar AutoCloseable, você pode garantir que recursos sejam fechados automaticamente, evitando vazamentos de memória e recursos.
  3. 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

  1. A, B – Você cria uma exceção personalizada extendendo Exception ou RuntimeException.
  2. B – O método close() é responsável por liberar recursos, como memória e conexões.
  3. C – Exceções de qualquer tipo podem ser geradas por um recurso, mas a maioria são Exception ou subclasses.
  4. B – O recurso será fechado automaticamente, mesmo com exceção.
  5. B – Se uma exceção for lançada no close(), ela é tratada no catch final (caso haja).

Deixe um comentário