Estes exemplos muito simples ilustram casos artificiais e servem para demonstrar o mecanismo das excepções. Não devem ser tomados como modelo de programação.
Considere-se a seguinte classe que define uma excepção:
class UmaExcepção extends Exception {}
Este programa ilustra o processamento básico de excepções.
Neste exemplo, pode ainda ver-se como um erro pode ser tratado em tempo de execução. Embora não seja habitual tratar os erros como se fossem excepções, é possível fazê-lo.
public class Teste1 {
public static void f() throws UmaExcepção {
throw new UmaExcepção();
}
public static void g() throws UmaExcepção {
g(); // vai rebentar com a pilha e gerar um StackOverflowError
}
public static void main(String[] args) {
// unreported exception UmaExcepção; must be caught or declared to be thrown
// g();
try {
g();
}
catch(StackOverflowError e) {
// não devia ser apanhado! mas pode ser...
System.out.println("PILHA!");
}
catch (UmaExcepção e) { /* este bloco nunca é executado! */ }
finally { System.out.println("FINALMENTE!"); }
}
}
$ java Teste1 PILHA! FINALMENTE!
public class Teste2 {
public static void f() throws UmaExcepção {
throw new UmaExcepção();
}
public static void g() throws UmaExcepção {
f();
}
public static void main(String[] args) {
try {
g();
}
catch (UmaExcepção e) {
System.out.println("UmaExcepção apanhada!");
}
finally {
System.out.println("FINALMENTE!");
}
}
}
$ java Teste2 UmaExcepção apanhada! FINALMENTE!
public class OutraExcepção extends Exception {
public OutraExcepção() {}
public OutraExcepção(Throwable cause){ super(cause); }
}
public class Teste3 {
void f() throws UmaExcepção { throw new UmaExcepção(); }
void g() throws UmaExcepção { f(); }
void h() throws OutraExcepção { throw new OutraExcepção(); }
public static void main(String args[]) throws OutraExcepção {
Z z = new Z();
try { z.g(); z.h(); }
catch (UmaExcepção u) { System.out.println("u"); throw new OutraExcepção(u); }
//catch (UmaExcepção u) { System.out.println("u"); throw new RuntimeException("batata", u); }
catch (Throwable t) { System.out.println("t"); }
finally { System.out.println("done! one way or another..."); }
}
}
Note-se que, em geral, a função main deveria tratar as excepções (as checked exceptions).