Exceções (Exception)
Autor: oberdan martins | Publicado: 2012-02-17T10:17:00-08:00



Até agora nós criamos pequenos programas sem nos preocuparmos em&nbsp;tratar possíveis erros. No entanto todos aqueles que programam há algum tempo&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;catch que captura todos os tipos de exceções –&nbsp;desta forma caso seja uma exceção&nbsp;do tipo java.lang.ArrayIndexOutOfBoundsException será tratado no primeiro bloco,&nbsp;todos os demais tipos serão tratados no segundo bloco.

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




Error: Representam situações&nbsp;incomuns, que não são causadas pelo programa, indicam situações que&nbsp;não acontecem usualmente durante a execução de um programa (Ex:&nbsp;Estouro da pilha de execução – StackOverflowError);


Checked Exception: Representam situações que,&nbsp;geralmente, não são erros de programação e sim indisponibilidade de&nbsp;recursos ou condição necessária para a correta execução inexistente (Ex:&nbsp;Em aplicações distribuídas existe dependência externa de rede de&nbsp;comunicação – NoRouteToHostException).


Unchecked Exception (RuntimeException): Representam situações que, geralmente, identificam erros&nbsp;de programação (programa não é robusto) ou mesmo situações&nbsp;incomuns/difíceis de tratar (Ex: Acessar índice inválido em um array –&nbsp;ArrayIndexOutOfBoundsException);


Segue quadro com relação de algumas das exceções mais comuns: