FWIW, я получаю предупреждение о функции:
public static int function(){
try{
return 1;
}catch(Exception e){
return 2;
}finally{
return 3; //WARNING on this line
}
}
Т.е.он говорит мне "наконец, блок не завершается нормально".Я все еще получаю 3 как возвращенное значение, несмотря ни на что.
В любом случае, если я попробую этот другой пример:
public class TestFinally {
public static void main(String[] args) {
int returnValue = function();
System.out.println("Return value: " + returnValue);
}
public static int function() {
try {
return 1;
}
catch (Exception e) {
return 2;
}
finally {
System.out.println("i don't know if this will get printed out.");
}
}
}
результат будет (очевидно)
i don't know if this will get printed out.
Return value: 1
Я понятия не имею, как его реализует JVM,но самый простой способ взглянуть на это (по крайней мере, концептуально) будет:
- возвращаемое значение в "try" помещается в стек,
- , затем "finally"выполняется блок,
- новое возвращаемое значение помещается в стек
- , выход из функции и возвращаемое значение выталкивается из стека, игнорируя первое.
Очень аккуратный вопрос.