Usando métodos que geram exceções

Java exige que toda exceção seja capturada e tratada. Como toda regra tem sua exceção (sem trocadilhos), exceções relacionadas a condições "triviais" de execução (derivadas da classe java.lang.RuntimeException) não precisam, mas podem, ser capturadas e tratadas. Há também situações nas quais o erro não deve ser tratado, o que é indicado pela classe java.lang.Error e suas derivadas.

O não-tratamento de uma exceção que deve ser tratada é acusado por um erro de compilação.

Exemplo

Considere o seguinte código, cujo objetivo é ler um inteiro a partir da entrada padrão de erros:

1  import java.io.*;
2  
3  public class ConvInt {
4      public String leLinha() {
5          byte[] tB = new byte[20];
6          System.in.read(tB);
7          String taTudo = new String(tB);
8          String taLimpo = taTudo.trim();
9          return taLimpo;
10     }
11     
12     public int leInt() {
13         String s = leLinha();
14         return Integer.parseInt(s);
15     }
16     
17     public static void main(String[] args) {
18         ConvInt ci = new ConvInt();
19         System.out.print("Entre inteiro: ");
20         int valor = ci.leInt();
21         System.out.println("Valor lido foi: " + valor); 
22     }
23 }

A tentativa de compilação dessa classe gera a seguinte mensagem de erro:
ConvInt.java:6: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method.

        System.in.read(tB);
                      ^
1 error                   

System.in é um objeto da classe InputStream, cujo método read() invocado na linha 6 pode gerar a exceção IOException, como visto. Essa é uma condição de erro que exige tratamento, pois caso contrário o programa prosseguiria em um estado potencialmente inconsistente. Portanto, o compilador Java não gera o bytecode para essa classe enquanto um tratamento para esse erro não for incluído no código.

Observe, no entanto, que o método parseInt() invocado na linha 14 também pode gerar uma exceção. Porém, o compilador Java não reclamou dessa condição, pois essa exceção está incluída no grupo de RuntimeExceptions.


© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP

Last modified: Mon Nov 8 12:26:33 EDT 1999