Olá desenvolvedores, hoje iremos falar sobre arquitetura das exceções em Java. Nesta série sobre tratamento de erros e exceções já apresentamos os fatores internos e externos mais comuns que atuam como os principais fatores da ocorrência de erros. Os fatores internos são caracterizados por problemas do próprio código, mas podem ser facilmente resolvidos pela equipe de desenvolvimento.

Entretanto, os fatores externos são motivados por fatores alheios ao controle da equipe de desenvolvimento. Dessa forma, sua solução pode levar um pouco mais de tempo para ser aviada.

Hoje iremos conhecer a arquitetura das exceções em Java. E talvez você esteja curioso com o termo arquitetura. Bom, existe toda uma sequência estruturada de exceções que sempre culminam nas classes Throwable ou Exception. Grosso o modo os erros em Java são entendidos como uma exceção.

CLASSE THROWABLE

Para entendermos a abrangência da frase “os erros em Java são entendidos como uma exceção”, é preciso antes compreendermos alguns conceitos. E começaremos com o “pai” de todos os erros, a classe Throwable.

A classe Throwable é a superclasse de todos os erros e exceções na linguagem Java. E apenas esta classe assim como suas subclasses podem ser um tipo de argumento em uma cláusula do tipo catch.

No Java podemos fazer verificações de exceções em tempo de compilação. ou seja, erros e/ou exceções que impedem a inicialização do sistema, por ocorrerem antes da fase de compilação.

Por convenção uma classe Throwable tem dois construtores, um que não aceita argumentos. E um segundo que aceita argumentos do tipo String, utilizado para exibir uma mensagem detalhada.

No entanto, as classes associadas ao Throwable devem aceitar outros dois construtores. E isto porque um deles representa a causa da exceção e este deve ser um Throwable. E um outro que também aceita uma String, isto é, que informa o erro por meio de uma mensagem detalhada.

CLASSE EXCEPTION

A classe Exception está no contexto da seguinte estrutura, java.lang.Object >> java.lang.Throwable >> java.lang.Exception. Assim, a classe Exception e suas subclasses são uma forma de ocorrência Throwable de indicar condições que um sistema pode querer capturar.

Em outras palavras, a classe Exception é também uma subclasse RuntimeException, isto é, exceções verificadas (unchecked exception). Este tipo de exceção é verificado no momento da execução. Razão pela qual o compilador não acusa erro em tempo de compilação.

As exceções verificadas precisam ser declaradas no escopo de um método ou construtor.

  • Exception() -> Constrói uma nova exceção com null e traz uma mensagem detalhada.
  • Exception(String mensagem) -> Constrói uma nova exceção com uma mensagem detalhada e específica.
  • Exception(String Message, Throwable cause) -> Constrói uma nova exceção com mensagem e causa detalhada e específica.
  • Exception(Throwable cause) -> Constrói uma nova exceção com a causa especificada e uma mensagem detalhada de (case === null? Null : cause.toString()) (que normalmente contém a classe e a mensagem detalhada da causa).

FONTE: ORACLE DOCS

ARQUITETURA DAS EXCEÇÕES

Posso afirmar sem medo de errar que cerca de 95% das vezes uma exceção lançada tem sua origem em um erro interno. Um erro de programação, que neste caso pode ser, um erro de lógica, de conversão.

E como mencionamos acima, o pai de todos os erros e/ou exceções é o Throwable. E as exceções podem ser divididas em dois blocos, compilação e runtime.  

O erro de compilação é aquele que impede o sistema de ser iniciado, por exemplo, a declaração de uma classe inexistente. Ou a tentativa de acessar um método também inexistente.

Em casos assim, a própria IDE já acusará o erro impedindo a execução do projeto, simplesmente por não conseguir compilar. Então, nem mesmo as classes para executar serão geradas, o que será exibido é o erro, e isso de uma forma bem especificada.

E o Runtime que é o erro que ocorre durante a execução do projeto, neste caso, quando o cliente está usando o sistema. Este tipo de exceção pode ocorrer por exemplo, quando o usuário estiver tentando emitir uma Nota Fiscal e a rotina do sistema se “quebrar”. Ou seja, esta exceção ocorre quando o sistema está em uso, e por este motivo o compilador não acusa erro em tempo de compilação.

TIPOS DE EXCEÇÃO

Conheça agora o significado de alguns tipos de exceções apresentados nesta estrutura.

ERROS EM TEMPO DE EXECUÇÃO

  • NullPointer Exception, é lançado quando tentamos manipular um objeto nulo.
  • ArrayIndexOutOfBoundsException lanaçado para indicar que houve a tentativa de acessar uma matriz ou um vetor com um índice negativo ou maior que o tamanho da matriz ou vetor.
  • classCastException lançado para indicar que o código tentou converter um objeto em uma subclasse da qual não é uma instância.

EXCEÇÕES

  • FileNotFoundException lançado quando o nome especificado do caminho de um arquivo não existe.
  • IOException lançado quando ocorre alguma exceção de entrada e saída de dados.

EM POUCAS PALAVRAS

Tendo aprendido sobre arquittura das exceções em Java agora sabemos que uma exceção (Exception) é uma filha da classe Throwable. E aprendemos a separar os tipos de erros de acordo com o momento em que eles ocorrem, seja em tempo de compilação ou em tempo de execução.

Infelizmente e inevitavelmente os erros irão acontecer. Dessa forma, saber um pouco sobre eles, sobre porque ocorrem, quando ocorrem e o que significa cada mensagem ou tipo de erro é o caminho mais curto para uma rápida solução. Você não deve temer os erros, mas se familiarizar com eles. Assim, você não somente saberá como e onde encontrá-los mas principalmente saberá evitá-los.