Después de leer el código de bytes del programa, el código es el siguiente:
El bloque finally declaraciones se colocarán en línea antes de la sentencia de retorno del bloque try, por lo que el regreso del fin bloque se ejecuta primero y la declaración de retorno original nunca lo hace.
Para el Programa:
String test() {
try {
System.out.println("try");
return "1";
} finally {
System.out.println("finally");
return "2";
}
}
Convierte a:
String test()
{
System.out.println("try");
String s = "1"; //temporary variable
System.out.println("finally");
return "2";
Exception exception;
exception;
System.out.println("finally");
return "2";
}
Y Para el programa: con bloque catch:
String test() {
try {
System.out.println("try");
return "1";
} catch (RuntimeException e) {
System.out.println("catch");
return "2";
} finally {
System.out.println("finally");
return "3";
}
}
se convierte en:
String test()
{
System.out.println("try");
String s = "1";
System.out.println("finally");
return "3";
RuntimeException e;
e;
System.out.println("catch");
String s1 = "2";
System.out.println("finally");
return "3";
Exception exception;
exception;
System.out.println("finally");
return "3";
}
Nota: Cumplido el uso de JDK 1.7 & decompilados usando Cavaj.
que se abstuvieron de que el minuto se me había ocurrido, pero todavía tenía curiosidad :) –