Exceções (Exception)


Até agora nós criamos pequenos programas sem nos preocuparmos em tratar possíveis erros. No entanto todos aqueles que programam há algum tempo sabem que o tratamento de erros (exceções) é parte fundamental da programação.

Para tratar exceções em Java utilizamos a declaração try-catch-finally. O que devemos fazer para proteger as instruções passíveis de gerar uma exceção, é inserí-las dentro deste bloco.

Tomemos, por exemplo, uma classe que imprime o segundo argumento passado através da linha de comandos. Supondo que não há verificação no código para o número de argumentos.

public class ExemploExcecao {

    public static void main(String[] args) {
  
       System.out.println(args[1]);
       System.out.print("Fim");

    }
}

Ao executar esta classe sem informar nenhum argumento e, ao tentar acessar diretamente, conforme o exemplo descrito, o segundo argumento args[1], uma exceção é obtida que interromperá a execução normal do programa, e a seguinte mensagem será mostrada:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at ExceptionExample.main(ExceptionExample.java:5)

Para prevenir que isto ocorra, podemos colocar o código dentro de um bloco try-catch. O bloco finally é opcional. Neste exemplo, não utilizaremos o bloco finally.

/* Exemplo que demonstra o uso do try/catch. Este bloco define dois 
trechos de código, um sujeito a erros (try) e outro que responsável 
pelo tratamento do erro caso aconteça (catch). */

public class ExemploExcecao {
    public static void main(String[] args) {
  
      try {
         System.out.println(args[1]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exceção detectada");
      }
   
      System.out.print("Fim");
   }
}

Assim, quando tentarmos rodar o programa novamente sem a informação dos argumentos, a saída trataria a exceção e o fluxo do programa não seria interrompido.

Porém, existem outros tipos de erros, veja:

// vamos modificar o programa de forma que ele encaminhe 
// como parâmetro um valor nulo (null).

public class ExemploExcecao {
    public static void main(String[] args) {
   
      try  {
       
     // Passando valor null como parametro. Isto gerará outro tipo de erro
         System.out.println(args[(Integer) null]); 
         
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exceção detectada");
      }
    
      System.out.print("Fim");
   }
}

Isto ocasionará uma exceção do tipo java.lang.NullPointerException.

Para corrigir este problema podemos encadear mais um bloco catch que capture todos os tipos de exceções, vejamos:

public class ExemploExcecao {
    public static void main(String[] args) {
   
      try {  
         System.out.println(args[(Integer) null]); 

      } catch (ArrayIndexOutOfBoundsException e) { // Trata um erro
       
         System.out.println("Exceção detectada");
         
      } catch (Throwable t) { // Trata todos os tipos de erros
       
       System.out.println("Mensagem de erro: " + t.getMessage());
       t.printStackTrace();
      }
    
      System.out.print("Fim");
   }
}

Perceba agora que, adicionamos mais um bloco de catch que captura todos os tipos de exceções – desta forma caso seja uma exceção do tipo java.lang.ArrayIndexOutOfBoundsException será tratado no primeiro bloco, todos os demais tipos serão tratados no segundo bloco.

Todas as exceções em Java derivam da classe Throwable conforme hierarquia a seguir:

  • Error: Representam situações incomuns, que não são causadas pelo programa, indicam situações que não acontecem usualmente durante a execução de um programa (Ex: Estouro da pilha de execução – StackOverflowError);
  • Checked Exception: Representam situações que, geralmente, não são erros de programação e sim indisponibilidade de recursos ou condição necessária para a correta execução inexistente (Ex: Em aplicações distribuídas existe dependência externa de rede de comunicação – NoRouteToHostException).
  • Unchecked Exception (RuntimeException): Representam situações que, geralmente, identificam erros de programação (programa não é robusto) ou mesmo situações incomuns/difíceis de tratar (Ex: Acessar índice inválido em um array – ArrayIndexOutOfBoundsException);
Segue quadro com relação de algumas das exceções mais comuns:




Nenhum comentário:

Postar um comentário