Dopo aver letto il bytecode del programma, il codice è il seguente:
Il blocco finally dichiarazioni è inline prima della dichiarazione di ritorno del blocco try, in modo che il ritorno dalla fine il blocco viene eseguito per primo e l'istruzione di ritorno originale non lo fa mai.
Per Programma:
String test() {
try {
System.out.println("try");
return "1";
} finally {
System.out.println("finally");
return "2";
}
}
Converte 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";
}
E Per il programma: con blocco 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";
}
}
Converte a:
0.123.
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: conforme con JDK 1.7 & Decompilato utilizzando Cavaj.
fonte
2015-07-28 10:27:05
Mi trattenni dal il minuto ho pensato, ma ancora ero curioso :) –