Après avoir lu le bytecode du programme, le code est le suivant:
Le bloc finally est inline avant l'instruction de retour du bloc d'essai, de sorte que le retour de la finalement bloc s'exécute en premier et l'instruction de retour d'origine ne le fait jamais.
pour le programme:
String test() {
try {
System.out.println("try");
return "1";
} finally {
System.out.println("finally");
return "2";
}
}
Il convertit:
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";
}
Et Pour le programme: avec bloc 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";
}
}
Converti à:
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";
}
Remarque: Conforme à l'aide de JDK 1.7 & Décompilé à l'aide de Cavaj.
je me suis abstenue de la minute où je pensais, mais j'étais toujours curieux :) –