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 |
|---|---|
|
|
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 |
|---|---|
|
|
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
}
GO TO FULL VERSION