1. throwoperador

Quando uma exceção é capturada por um catchbloco, e até que seja lançada para a máquina Java, é apenas um objeto que herda Exception(ou melhor, Throwable). O próprio objeto de exceção não possui propriedades mágicas.

Toda a lógica de como as exceções funcionam é apenas uma maneira especial pela qual a máquina Java se comporta quando uma exceção é lançada para ela.

Você sempre pode relançar uma exceção capturada para a máquina Java. Para fazer isso, você precisa usar o throwoperador:

throw exception;

Exemplo:

Código Saída do console
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

Nesse código, capturamos uma exceção, exibimos uma mensagem sobre ela na tela e a lançamos novamente.

Uma exceção relançada não pode ser capturada por outros catchblocos no mesmo trybloco.


2. Suas exceções

A propósito, você mesmo pode criar um objeto de exceção: é apenas um objeto cujo tipo é Exceptionou uma classe que o herda. E jogá-lo.

É mais fácil do que parece. Exemplo:

Código Saída do console
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

No exemplo acima, criamos um novo objeto de exceção cujo tipo é RuntimeExceptione imediatamente o lançamos usando o throwoperador.

Ele será capturado imediatamente pelo catchbloco, pois RuntimeException herda Exception. O catch (Exception except)código captura objetos de exceção de todas as classes que herdam a Exceptionclasse.



3. finallypalavra-chave

Outro ponto importante. Às vezes, um programador precisa executar alguma ação, independentemente de ter ocorrido uma exceção no código. Por exemplo, suponha que abrimos um arquivo para gravação. O arquivo aberto deve ser fechado chamando close().

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

Para executar essas ações obrigatórias, outro tipo de bloco ( finally) foi adicionado ao try-catchconstructo, criando assim o try-catch-finallyconstructo. Se parece com isso:

Exemplo:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

O código no finallybloco será executado em qualquer caso, independentemente de haver uma exceção. Mesmo que uma exceção seja lançada e não capturada, o finallybloco ainda será executado.

A propósito, se você não deseja capturar uma exceção, mas precisa de um finallybloco, use a notação abreviada para a try-catch-finallyconstrução: um try-finallybloco. Parece algo assim:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}