Baita tricky question hein?!
Fiz uns testes aqui e acredito que o objeto da exceção “se perde” e fica disponível para o Garbage Collector (o mesmo que ocorre quando um método com retorno é invocado e o retorno não é atribuído a nenhuma variável).
Tente executar um teste mais completo, assim:
public class DoubleThrows {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
System.out.println(e);
}
}
private static void test() throws Exception {
try {
System.out.println("Passou no try");
throw new MyException("Excecao 1");
} finally {
System.out.println("Passou no finally");
System.gc();
throw new MyException("Excecao 2");
}
}
}
class MyException extends Exception {
String text;
MyException(String text) {
super(text);
this.text = text;
System.out.println("Instanciou " + text);
}
@Override
protected void finalize() throws Throwable {
System.out.println("Passou no finalize de " + text);
super.finalize();
}
@Override
public String toString() {
return "Lançou exceção " + text;
}
}
@SuppressWarnings("finally")
private static void opa() throws Exception{
try{
throw new IllegalArgumentException("opa");
}finally{
throw new IllegalArgumentException("opa 1");
}
}
ou sem ele mesmo…
alias veja o super classe Throwable vai ficar na pilha… as Exceptions
/**
* Record in the receiver a walkback from the point
* where this message was sent. The message is
* public so that code which catches a throwable and
* then <em>re-throws</em> it can adjust the walkback
* to represent the location where the exception was
* re-thrown.
*
* @return the receiver
*/
public native Throwable fillInStackTrace();
Realmente, o finally é desncessário nesse caso.
Aliás, acho que não é interessante lançar exceções dentro do finally. Acho que fazer isso pode gerar mais problemas do que soluções.
Mas acho que a pergunta do nosso colega é: e se for lançada exceção no finally, o que acontece?