После прочтения ByteCode программы код выглядит следующим образом:
Операторы блока finally встроены перед оператором возврата блока try, поэтому возврат из блока finally выполняется первым, а исходный оператор возврата никогда не выполняется.
Для программы:
String test() {
try {
System.out.println("try");
return "1";
} finally {
System.out.println("finally");
return "2";
}
}
Преобразуется в:
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";
}
И Для программы: с блоком перехвата:
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";
}
}
Преобразует в:
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";
}
Примечание: выполняется с использованием JDK 1.7 и декомпилируется с использованием Cavaj.