JVM использует стек значений для хранения значений, и этот стек является общим для всех вызовов методов в этом потоке. Обычно, когда возвращается непустой метод, возвращаемое значение помещается в стек, а вызывающий объект извлекает его из стека и либо использует, либо отбрасывает.
return
Заявление {{ 1}}[...] Оператор
return
без Выражения пытается передать управление вызывающей стороне метода или конструктора, который его содержит.[...] Оператор
return
с Выражением пытается передать управление вызывающей стороне метод, который его содержит; значение Выражения становится значением вызова метода.[...] Таким образом, можно видеть, что оператор return всегда завершается внезапно.
Внезапное завершение действительно означает, что любые последующие операторы не будут выполняться, и это может фактически привести к ошибке времени компиляции в некоторых случаях ( JLS 14.21 Unreachable Statements )
void unreachable() {
return;
System.out.println("Bye!"); // DOESN'T COMPILE! Unreachable code!
}
Продолжая ...
В предыдущих описаниях говорится, что « пытается передать управление», а не просто «передает управление», потому что, если есть какие-либо
команды try
[... ] тогда любые предложенияfinally
[...] будут выполнены [...] Внезапное завершение предложенияfinally
может прервать передачу управления, инициированнуюreturn
заявление.
Это означает, что следующая функция вернет -1
вместо 0
.
int tryReturn() {
try {
return 0;
} finally {
return -1;
}
}
Однако при отсутствии try-finally
управление будет немедленно передано, а значение Expression , если оно есть, будет передано вызывающей стороне.