Por que eu devo ler este artigo: Durante a execução de um programa podemos ser surpreendidos por eventos inesperados. Quando esse tipo de evento acontece, o fluxo normal do programa é interrompido e o programa/aplicação é finalizado. Diante disso, para escrever um bom programa é preciso incluir um bom gestor de erros e recuperação. O mecanismo de exceções da linguagem Java fornece uma abordagem simples e organizada para isso. Assim, ao invés de deixarmos o programa terminar devido a situações inesperadas, podemos escrever código para lidar com essas exceções e continuar a execução do programa normalmente. Neste artigo, vamos conhecer as várias categorias de exceções da linguagem Java, aprender a utilizar o mecanismo de exceções que temos disponível para tratá-las, analisar a hierarquia de exceções e entender a importância das informações contidas no stack trace gerado por uma exceção.

Qualquer condição que interrompa o fluxo normal de um programa em execução é um erro ou uma exceção. Para compreender melhor esses dois termos, é importante, desde já, saber diferenciá-los. Um erro significa um problema no código ou em um arquivo de configuração que deve ser corrigido para que seja solucionado. Enquanto não houver correção, o problema voltará a acontecer sempre nas mesmas linhas. Alguns exemplos de erros são:

  • Tentativa de conexão a uma base de dados inexistente;
  • Acessar variáveis não estáticas a partir de métodos estáticos.

Por sua vez, uma exceção (ou evento excepcional) não está necessariamente relacionada com o código do programa, pode estar relacionada com condições externas que impedem o funcionamento normal da aplicação. Nesse caso, a criação do tratamento de exceções não é necessária para o correto funcionamento do programa, basta que a condição (ou condições) externa(s) que provoca(m) a exceção deixe(m) de existir. Entretanto, não queremos permitir que o programa termine inesperadamente, por isso podemos escrever código para lidar com as exceções e continuar o seu fluxo normal de execução. Alguns exemplos de exceções são:

  • A base de dados com a qual o programa tenta se conectar está offline;
  • Manipulação de operandos fora dos limites dos seus intervalos.

Hierarquia de exceções

Todas as classes de exceções são subtipos da classe java.lang.Exception. Por sua vez, Exception é uma subclasse de Throwable, assim como a classe Error. A Figura 1 nos mostra a hierarquia das exceções em Java.

Hierarquia das exceções na linguagem Java
Figura 1. Hierarquia das exceções na linguagem Java. Fonte: http://theprogrammingsintroduction.blogspot.com.br/2014/07/what-is-exception-handling-in-java.html

A classe Error é um caso especial e distinto das exceções, já que os erros são condições anormais que ocorrem em caso de falhas graves do sistema. Voltaremos a falar sobre esse assunto mais à frente.

Os três tipos de exceções

Para ajudar na organização das exceções, elas foram divididas em três categorias. É essencial entender essa divisão para compreender como o tratamento de exceções funciona na linguagem Java.

Checked exceptions

O primeiro tipo de exceção é a checked exception. Uma checked exception é uma exceção que ocorre em tempo de compilação, por isso também é chamada de exceção de tempo de compilação. Essas exceções não podem ser ignoradas, o programador deve, obrigatoriamente, tratar todas as exceções desse tipo, caso contrário é gerado um erro de compilação. A Listagem 1 mostra um exemplo de checked exception.

  1  public static void save(String filename, Object object) {
  2    // Writing data...
  3    ObjectOutputStream oos = null;
  4        
  5    File file = new File(filename);
  6    System.out.println("Path: " + file.getAbsolutePath());
  7    oos = new ObjectOutputStream(new FileOutputStream(file));
  8    System.out.println("Nome do arquivo: " + filename);
  9    oos.writeObject(object);
  10 }
   
  -- Erros de compilação: 
  Unhandled exception type FileNotFoundException TestClassException.java /TestProject    
  line 7  Java Problem
  Unhandled exception type IOException   TestClassException.java /TestProject    
  line 7  Java Problem
  Unhandled exception type IOException   TestClassException.java /TestProject    
  line 9  Java Problem
Listagem 1. Exemplo de checked exception.

Como podemos observar, na linha 7 tivemos dois erros de compilação, provenientes de duas exceções não tratadas: FileNotFoundException e IOException. Da mesma forma, na linha 9 temos um erro de compilação devido à exceção IOException, que, como dito, não foi tratada.

Conseguimos determinar as exceções que um método lança ao navegar pela API do Java, já que na assinatura do método temos obrigatoriamente que dizer que tipo de exceção (checked exception) ele pode lançar, através da instrução throws. Na Listagem 2 podemos ver a assinatura do construtor ObjectOutputStream e a exceção que esse construtor pode lançar.

1    public ObjectOutputStream(OutputStream out) throws IOException {  ]
2    (...)
Listagem 2. Assinatura do construtor ObjectOutputStream

Como podemos notar, a classe ObjectOutputStream lança a checked exception IOException, daí um dos erros gerados na linha 7 do código da Listagem 1.

  1    public FileOutputStream(File file) throws FileNotFoundException {
  2    (...)
Listagem 3. Assinatura do construtor FileOutputStream

Do mesmo modo, podemos verificar na Listagem 3 que o construtor FileOutputStrea ...

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo