Gerando exceções

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;
}

Definição de novas exceções

É 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;
}

Repassando a exceção

É 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

Last modified: Mon Nov 8 12:29:09 EDT 1999