![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| AndrewMormysh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 8.2.2008 Репутация: 1 Всего: 1 |
Объясните, пожалуйста, особенности поведения return в следующем примере:
Да, finally должен сработать всегда, но и return должен остановить выполнение метода и вернуть результат. Мне интересно что происходит в виртуальной машине и как устроен механизм перехода указателя стека при работе метода, в котором есть и return и finaly. |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Классный вопрос, никогда не задумывался. Но по поведению программы легко определить механизм. После того как выбрасывается любой Exception, вызывается блок finally, затем блок с соответствующим Exception.
|
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 6 Всего: 93 |
Это известная штука, читал о ней некоторое время назад.
В C# запрещено писать return (и другие операторы перехода, например goto) в блок finally -- комилятор сразу ругается на ошибку.
Да вроде наоборот, сначала обрабатывается catch, потом уже finally. Могу предположить, что в JVM есть некий регистр, который используется для возврата значения. Сначала в блоке catch вызов return 2 пишет туда 2, потом в finally вызов return 1 перезаписывает его и там остаётся 1. Но это только предположение. И, кстати, этот пример можно ещё подсократить и получить совсем прикольный побочный эффект:
Тут хоть и отсутствует catch, но исключение будет "проглочено" в finally и из метода мы выйдем совершенно без ошибок. -------------------- Да. Именно так. |
||||
|
|||||
| AndrewMormysh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 8.2.2008 Репутация: 1 Всего: 1 |
Немного поясню как я себе представляю суть процессов. Это плохо, что я не знаю как на самом деле происходит, но пока не знаю и где это посмотреть Итак, далее следует исключильное ИМХО: при вызове throw new Exception на стеке создается новый указатель на объект Exception и если нет обработчиков, то именно он и вернется из метода. Дальше, если есть обработчик, то заходим туда. Вот тут то и самое интересное, при вызове return в стек, в нашем случае, помещается возвращаемое значение 2 и... метод должен прервать свое выполнение, но потом механизм обработки искл. ситуаций всё равно заходит в блок finaly и выполняет в нем код (на сколько вообще он там корректно сможет отработать при разных вариациях - вопрос отдельный) и соответственно при вызове return в стек помещается очередное значение 1 (или выталкивает предыдущее и заносит новое - тут вопрос). На выходе из метода получаем 1. В общем, это то, как я вижу это. Надеюсь, более квалифицированные специалисты прокомментируют с подробностями мои предположения. |
|||
|
||||
| SaSho |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 10.6.2007 Где: Днепропетровск Репутация: 2 Всего: 3 |
Можно и без Exception'ов. Вот этот код вернёт значение 1:
|
|||
|
||||
| AndrewMormysh |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 8.2.2008 Репутация: 1 Всего: 1 |
Если обратиться к документации, например Java Reference, почти всё становится ясным. Думаю, нюансы по поведению return стоит искать в недрах java - как всё таки передается управление между строками кода.
|
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Как вообще работает return в ЯВУ очень хорошо показывает паскаль
-------------------- ![]() ![]() |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |