Embora toda exceção deva ser tratada, nem sempre é possível tratar uma exceção no mesmo escopo do método cuja invocação gerou a exceção. Nessas situações, é possível propagar a exceção para um nível acima na pilha de invocações.
Para tanto, o método que está deixando de capturar e tratar a exceção faz uso da cláusula throws na sua declaração:
void métodoQueNãoTrataExceção() throws Exception { invoca.métodoQuePodeGerarExceção(); }
Nesse caso, métodoQueNãoTrataExceção() reconhece que em seu corpo há a possibilidade de haver a geração de uma exceção mas não se preocupa em realizar o tratamento dessa exceção em seu escopo. Ao contrário, ele repassa essa responsabilidade para o método anterior na pilha de chamadas.
Eventualmente, também o outro método pode repassar a exceção adiante. Porém, pelo menos no main() as exceções deverão ser tratadas.
A seguir, o exemplo da aquisição de um valor inteiro a partir da entrada padrão é reapresentado com o uso da cláusula throws. Nesse caso, throws tem que ser declarado em dois métodos. Primeiro no método leLinha, que invoca read() e não faz o tratamento de IOException. Segundo, no método leInt, que pode receber o IOException de leLinha mas também não faz seu tratamento. Para ilustrar, nesse segundo caso inclui-se também a declaração de que o método pode também gerar a exceção NumberFormatException.
1 import java.io.*; 2 3 public class ConvInt3 { 4 public String leLinha() 5 throws IOException { 6 byte[] tB = new byte[20]; 7 System.in.read(tB); 8 String taTudo = new String(tB); 9 String taLimpo = taTudo.trim(); 10 return taLimpo; 11 } 12 13 public int leInt() 14 throws IOException, NumberFormatException { 15 String s = leLinha(); 16 return Integer.parseInt(s); 17 } 18 19 public static void main(String[] args) { 20 ConvInt3 ci = new ConvInt3(); 21 System.out.print("Entre inteiro: "); 22 try { 23 int valor = ci.leInt(); 24 System.out.println("Valor lido foi: " + valor); 25 } 26 catch (IOException ioe) { 27 System.err.println("Erro de leitura"); 28 } 29 catch (NumberFormatException nfe) { 30 System.err.println("Erro de formato"); 31 } 32 } 33 }
© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP