Po odczytaniu kodu bajtowego programu, kod jest w następujący sposób:
bloku finally oświadczenia jest inlined przed stwierdzeniem powrotnej bloku try, więc powrót z finally blok wykonuje się jako pierwszy, a oryginalna instrukcja return nigdy nie działa.
programu:
String test() {
try {
System.out.println("try");
return "1";
} finally {
System.out.println("finally");
return "2";
}
}
To konwertuje do:
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";
}
I programu: z bloku 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";
}
}
konwertuje do:
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";
}
Uwaga: spełnionych przy użyciu JDK 1.7 & dekompilowana użyciu Cavaj.
I powstrzymał się od niego w chwili myślałem o tym, ale nadal byłem ciekawy :) –