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.
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