Возврат значения из функции - PullRequest
7 голосов
/ 24 апреля 2010

Как внутренне работает возврат значения из функции?

См. Этот пример ..

альтернативный текст http://img708.imageshack.us/img708/6853/stack.png

Ответы [ 2 ]

7 голосов
/ 24 апреля 2010

JVM использует стек значений для хранения значений, и этот стек используется всеми вызовами методов в этом потоке. Обычно, когда возвращается не void метод, возвращаемое значение помещается в стек, и вызывающая сторона выталкивает его из стека и либо использует его, либо отбрасывает.

2 голосов
/ 24 апреля 2010

JLS 14.17 return Заявление

[...] return оператор без выражения пытается передать управление вызывающему методу или конструктору, который его содержит.

[...] оператор return с выражением пытается передать управление вызывающему методу, который его содержит; значение Expression становится значением вызова метода.

[...] Таким образом, видно, что оператор return всегда завершается внезапно.

Резкое завершение означает , что означает, что любые последующие операторы не будут выполняться, и в некоторых случаях это может привести к ошибке во время компиляции ( JLS 14.21 Недоступные утверждения )

void unreachable() {
   return;
   System.out.println("Bye!"); // DOESN'T COMPILE! Unreachable code!
}

Продолжаем ...

В предыдущих описаниях говорится " пытается передать управление", а не просто "передает управление", потому что, если есть какие-либо операторы try [...], то любые finally предложения [... ] будет выполнено [...] Неожиданное завершение предложения finally может нарушить передачу управления, инициированную оператором return.

Это означает, что следующая функция будет return -1 вместо 0.

int tryReturn() {
   try {
      return 0;
   } finally {
      return -1;
   }
}

При отсутствии try-finally управление будет немедленно передано, и значение Expression , если оно есть, будет передано вызывающей стороне.

...