A sinalização da ocorrência de uma condição excepcional de execução se dá através do comando throw, como ilustrado em:
public double calculaDivisao (int numerador, int denominador) throws Exception { if (denominador == 0) throw new Exception("Dividiu por zero"); return ((double) numerador) / denominador; }
É possível para uma aplicação definir e sinalizar suas próprias exceções. Por exemplo, considere que fosse importante para uma aplicação diferenciar a condição de divisão inteira por zero de outras condições de exceções artiméticas. Neste caso, uma classe DivideByZeroException poderia ser criada:
public class DivideByZeroException extends ArithmeticException { public DivideByZeroException() { super("O denominador na divisão inteira tem valor zero"); } }
A classe contém apenas um construtor, que invoca o construtor da superclasse especificando uma mensagem descrevendo a exceção. Esta é a mensagem que será retornada pelo método getMessage() quando invocado sobre um objeto dessa classe.
A sinalização da exceção se dá através do comando throw:
// Método que usa divisão inteira e pode gerar a exceção: public double calculaDivisao (int numerador, int denominador) throws DivideByZeroException { if (denominador == 0) throw new DivideByZeroException(); return (double) numerador / denominador; }
É possível usar o comando throw para repassar a sinalização da condição de exceção adiante, como em
public void usaDivisao() throws DivideByZeroException { /* ... */ try { d = calculaDivisao(x, y); } catch (DivideByZeroException dbze) { d = 0; throw dbze; } /* ... */
Nesse caso, a informação associada à exceção (como o seu ponto de origem, registrado internamente no atributo do objeto que contém a pilha de invocações) é preservada. Caso fosse desejado mudar essa informação, uma nova exceção poderia ser gerada ou, caso a exceção seja a mesma, o método fillInStackTrace() poderia ser utilizado, como em
... throw dbze.fillInStackTrace(); ...
© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP