DEV Community

Capturando exceções de subclasses

Captura de exceções de subclasses:

  • Exceções de subclasses são capturadas pela cláusula catch de uma superclasse.

Exemplo: A superclasse de todas as exceções é Throwable. Se Throwable for capturado, todas as suas subclasses também serão tratadas.

Ordem das instruções catch:
A cláusula catch de uma subclasse deve sempre preceder a da superclasse.
Caso contrário, a superclasse capturaria todas as exceções, inclusive as da subclasse, tornando o código da subclasse inalcançável, o que é um erro em Java.

Exemplo de código com exceções de subclasses:

O exemplo a seguir captura exceções do tipo ArrayIndexOutOfBoundsException (subclasse) e Throwable (superclasse).

Exemplo de código:

// Subclasses devem preceder as superclasses em instruções catch.
class ExcDemo5 {
    public static void main(String args[]) {
        // O array numer é mais longo que denom.
        int numer[] = { 4, 8, 16, 32, 64, 128, 256, 512 };
        int denom[] = { 2, 0, 4, 4, 0, 8 };

        for (int i = 0; i < numer.length; i++) {
            try {
                // Tenta realizar a divisão
                System.out.println(numer[i] + " / " + denom[i] + " is " + numer[i] / denom[i]);
            } catch (ArrayIndexOutOfBoundsException exc) {
                // Captura exceção de acesso fora dos limites do array
                System.out.println("No matching element found.");
            } catch (Throwable exc) {
                // Captura qualquer outra exceção
                System.out.println("Some exception occurred.");
            }
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

Esse caso, catch(Throwable) captura todas as exceções exceto ArrayIndexOutOfBoundsException. O problema da captura de exceções de subclasses passa a ser mais importante quando nós mesmos criamos as exceções.

Saída do programa:
O programa exibe o resultado das divisões corretas.
Quando ocorre uma exceção fora dos limites do array, ela é tratada pela cláusula catch correspondente.

Exceções não capturadas por ArrayIndexOutOfBoundsException são capturadas pela superclasse Throwable.

Exemplo de saída:

4 / 2 is 2
Some exception occurred.
16 / 4 is 4
32 / 4 is 8
Some exception occurred.
128 / 8 is 16
No matching element found.
No matching element found.

Enter fullscreen mode Exit fullscreen mode

Regra importante:
Subclasses devem sempre preceder superclasses na ordem dos blocos catch para evitar que o código da subclasse seja inalcançável.

Conclusão:
Ao tratar exceções, certifique-se de ordenar os blocos catch de maneira correta, colocando as exceções de subclasses antes das superclasses. Isso garante que o tratamento seja feito de forma apropriada e evita erros de código inalcançável em Java.

Image description

Top comments (0)