Capturando e tratando exceções

A sinalização da exceção é propagada a partir do bloco de código onde ela ocorreu através de toda a pilha de invocações de métodos até que a exceção seja capturada por um bloco manipulador de exceção. Eventualmente, se tal bloco não existir em nenhum ponto da pilha de invocações de métodos, a sinalização da exceção atinge o método main(), fazendo com que o interpretador Java apresente uma mensagem de erro e aborte sua execução.

Blocos try-catch

A captura e o tratamento de exceções em Java se dá através da especificação de blocos try, catch e finally, definidos através destas mesmas palavras reservadas da linguagem. Um comando try/catch/finally obedece à seguinte sintaxe:

try {
   //  código que inclui comandos/invocações de métodos
   //  que podem gerar uma situação de exceção.
}
catch (XException x) {
   //  bloco de tratamento associado à condição de
   //  exceção XException ou a qualquer uma de suas
   //  subclasses, identificada aqui pelo objeto
   //  com referência x
}
catch (YException y) {
   //  bloco de tratamento para a situação de exceção
   //  YException ou a qualquer uma de suas subclasses
}
finally {
   //  bloco de código que sempre será executado após
   //  o bloco try, independentemente de sua conclusão
   //  ter ocorrido normalmente ou ter sido interrompida
}

Os blocos não podem ser separados por outros comandos -- um erro de sintaxe seria detectado pelo compilador Java neste caso. Cada bloco try pode ser seguido por zero ou mais blocos catch, onde cada bloco catch refere-se a uma única exceção.

O bloco finally é sempre executado. Em geral, ele inclui comandos que liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try e que podem ser liberados, independentemente de a execução ter encerrado com sucesso ou ter sido interrompida por uma condição de exceção. A presença desse bloco é opcional.

Exemplo

Para tornar o exemplo anterior funcional, é preciso tratar a exceção que pode ser gerada na execução da linha 6. Para tanto, uma possibilidade é substituir essa linha por

	try {
	    System.in.read(tB);
	}
	catch (IOException e) {
            System.err.println(e);
	}

Nesse caso, o tratamento dado para a ocorrência do erro foi simplesmente apresentar na saída padrão de erros uma mensagem associada à exceção ocorrida. O programa completo fica:

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

© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP

Last modified: Mon Nov 8 12:27:00 EDT 1999