Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работает return 
:(
    Опции темы
AndrewMormysh
Дата 9.9.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 8.2.2008

Репутация: 1
Всего: 1



Объясните, пожалуйста, особенности поведения return в следующем примере:
Код

public class TryFinalyReturnDemo {
    public static int f() {
        try {
            throw new Exception();
        }
        catch (Exception e) {
            return 2;
        }
        finally {
            return 1;
        }
    }

    public static void main(String[] args) {
       System.out.println(f());
    }
}


Да, finally должен сработать всегда, но и return должен остановить выполнение метода и вернуть результат. Мне интересно что происходит в виртуальной машине и как устроен механизм перехода указателя стека при работе метода, в котором есть и return и finaly.
PM MAIL   Вверх
Platon
Дата 9.9.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Классный вопрос, никогда не задумывался. Но по поведению программы легко определить механизм. После того как выбрасывается любой Exception, вызывается блок finally, затем блок с соответствующим Exception.
PM MAIL ICQ   Вверх
Дрон
Дата 9.9.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 93



Это известная штука, читал о ней некоторое время назад.

В C# запрещено писать return (и другие операторы перехода, например goto) в блок finally -- комилятор сразу ругается на ошибку.

Цитата(Platon @  9.9.2008,  09:04 Найти цитируемый пост)
После того как выбрасывается любой Exception, вызывается блок finally, затем блок с соответствующим Exception. 

Да вроде наоборот, сначала обрабатывается catch, потом уже finally.
Могу предположить, что в JVM есть некий регистр, который используется для возврата значения. Сначала в блоке catch вызов return 2 пишет туда 2, потом в finally вызов return 1 перезаписывает его и там остаётся 1. Но это только предположение.

И, кстати, этот пример можно ещё подсократить и получить совсем прикольный побочный эффект:
Код
try
{
     throw new Exception();
}
finally
{
      return;
}

Тут хоть и отсутствует catch, но исключение будет "проглочено" в finally и из метода мы выйдем совершенно без ошибок.


--------------------
Да. Именно так.
PM   Вверх
AndrewMormysh
Дата 9.9.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 8.2.2008

Репутация: 1
Всего: 1



Цитата(Platon @ 9.9.2008,  08:04)
После того как выбрасывается любой Exception, вызывается блок finally, затем блок с соответствующим Exception.

Немного поясню как я себе представляю суть процессов. Это плохо, что я не знаю как на самом деле происходит, но пока не знаю и где это посмотреть smile Надеюсь форум мне поможет. 

Итак, далее следует исключильное ИМХО: при вызове throw new Exception на стеке создается новый указатель на объект Exception и если нет обработчиков, то именно он и вернется из метода. Дальше, если есть обработчик, то заходим туда. Вот тут то и самое интересное, при вызове return в стек, в нашем случае, помещается возвращаемое значение 2 и... метод должен прервать свое выполнение, но потом механизм обработки искл. ситуаций всё равно заходит в блок finaly и выполняет в нем код (на сколько вообще он там корректно сможет отработать при разных вариациях - вопрос отдельный) и соответственно при вызове return в стек помещается очередное значение 1 (или выталкивает предыдущее и заносит новое - тут вопрос). На выходе из метода получаем 1.

В общем, это то, как я вижу это. Надеюсь, более квалифицированные специалисты прокомментируют с подробностями мои предположения.
PM MAIL   Вверх
SaSho
Дата 9.9.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.6.2007
Где: Днепропетровск

Репутация: 2
Всего: 3



Можно и без Exception'ов. Вот этот код вернёт значение 1:
Код

    try {
      return 2;
    }
    finally {
      return 1;
    }


PM MAIL ICQ Jabber   Вверх
AndrewMormysh
Дата 9.9.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 8.2.2008

Репутация: 1
Всего: 1



Если обратиться к документации, например Java Reference, почти всё становится ясным. Думаю, нюансы по поведению return стоит искать в недрах java - как всё таки передается управление между строками кода.
PM MAIL   Вверх
w1nd
Дата 9.9.2008, 12:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Как вообще работает return в ЯВУ очень хорошо показывает паскаль smile Заурядная там конструкция:

Код
Result := ...;
Exit;



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.