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