Veberiano,
Todo código que lança um exceção possui uma ou mais linhas do tipo
if(condição_anormal)
throw new XXXThrowable(“sss”); // cria e lança um objeto exceção
A própria JVM lança as suas exceções também, geralmente na forma de objetos de uma subclasse de Throwable (a mãe-de-todas-as-exceções) chamada Error.
Todo método relança automaticamente exceções de baixo nível. É como se a declaração fosse sempre, no mínimo, a seguinte:
void mmm() throws Error, RuntimeException
{
}
A parte da JVM que chama o método main de uma classe é equivalente a
int status = 0;
try
{
XXX.main(args);
}
catch(Throwable t)
{
t.printStackTrace();
status = 1;
}
finally
{
System.exit(status);
}
Eis uma visão da hieraquia de classes de exceção:
//a mãe-de-todas-as-exceções
Throwable
// Erros sérios de baixo nível
Error extends Throwable
// classe básica de todas as exceções da lib e do programa
Exception extends Throwable
// típica exceção de library
IOException extends Exception
// exceção feita pelo programador
XXXException extends Exception
// Exceções não-checadas (não são obrigadas a catch)
RuntimeException extends Throwable
IllegalArgumentException extends RuntimeException
NullPointerException extends RuntimeException
Os blocos catch devem ser colocados com as exceções mais especializadas em primeiro lugar.