Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18

TRICKS: Что вернёт метод?

17.02.2014, 13:39. Показов 3656. Ответов 42

Студворк — интернет-сервис помощи студентам
начинаем серию постов TRICKS по фишкам JVM и компилятора, вопросы для самообразования, не более

просьба не компилировать, а попробовать подумать что вернёт метод

Java
1
2
3
4
5
6
7
8
9
10
    static String dubleReturn() {
        while (true) {
            try {
                return "foo";
            } finally {
                break;
            }
        }
        return "boo";
    }
а после того как скомпилите и увидите результат, прошу объяснить почему именно так

ps: вопрос чисто академический, поэтому не стоит нести чушь про то что так писать негоже
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2014, 13:39
Ответы с готовыми решениями:

TRICKS: Что нам грядущая 8-чка готовит
допустим у нас есть List l = new ArrayList() { { for (int i = 0; i < 10; i++) { ...

Пример, когда метод Thread.isAlive() вернёт false
Приведите, пожалуйста, два примера. Такие, что бы в первом main thread при вызове на ней метода isAlive(); вернула false, а во втором...

Reflection: что вернет getField.getInt(null)?
У Хорстмана наткнулся на следующую строку: return JOptionPane.class.getField(s).getInt(null); И все не могу сообразить, что оно вернуть...

42
]:->
 Аватар для dan41k
102 / 96 / 19
Регистрация: 12.11.2013
Сообщений: 398
17.02.2014, 14:22
Кликните здесь для просмотра всего текста
Угадал) Может, из-за того, что один return заменяется другим, если это возможно. (имеется в виду, возможность компиляции, как в данном случае).
0
3 / 3 / 1
Регистрация: 18.09.2013
Сообщений: 19
17.02.2014, 14:33
На java не пишу, но решил правильно.
Рассуждал примерно так:
В строчке
Java
1
return "foo"
выход из функции не происходит, поскольку необходимо сначала выполнить финализацию try..finally блоке.
Оператор break быстрее всего реализован на байт-коде как jump на оператор следующий после цикла.
В результате возвращаем "boo"

Если я прав, то задача, как раз неинтересная
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.02.2014, 14:43  [ТС]
Цитата Сообщение от vladimirsky Посмотреть сообщение
Если я прав, то задача, как раз неинтересная
неправ, сначала выполнится try блок а потом finally - всё по спекам, задача ОК

Добавлено через 1 минуту
завтра напишу расклад по тому что происходит, если конечно меня не обгонит кто либо )
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
17.02.2014, 14:49
Долго искал подвох. Не нашел. Ответ в данном случае очевиден, надо только понимать, что делает return и как работает finally.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.02.2014, 14:51  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Долго искал подвох. Не нашел.
подвох в том что нет catch блока, и не тровится эксепшен, значит ничего не мешает дойти до места
return "foo"; и выполнить его, и оно таки доходит и по идее по спекам должен выполниться final блок и потом вернуться указателем на точку где остановился return "foo" )
проверьте
Java
1
2
3
4
5
6
7
static String tryFinally() {
        try {
            return "foo";
        } finally {
            System.out.println("finally");
        }
    }
0
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
17.02.2014, 15:06
как я и думал, в результате будет "boo".
первым сработает return "foo";, но finally 100% вызовет break, что в свою очередь заставит выйти с цикла while и выполнить следующую строку : return "boo";
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
17.02.2014, 15:12
Цитата Сообщение от mutagen Посмотреть сообщение
подвох в том что нет catch блока, и не тровится эксепшен, значит ничего не мешает дойти до места
return "foo"; и выполнить его, и оно таки доходит и по идее по спекам должен выполниться final блок и потом вернуться указателем на точку где остановился return "foo" )
Ну так я же говорю - надо знать, как работает return

Code
1
2
3
4
5
6
7
 0 ldc #10 <foo>
 2 astore_0
 3 goto 10 (+7)
 6 astore_1
 7 goto 10 (+3)
10 ldc #11 <boo>
12 areturn
0
 Аватар для _Den_
161 / 157 / 29
Регистрация: 21.09.2013
Сообщений: 487
Записей в блоге: 2
17.02.2014, 15:14
Так как finally обязательно должен быть выполнен, то return "foo"; не дает повода ухода из метода, break прекращает цикл и следующее действие return "boo"; Как-то так

Добавлено через 1 минуту
Цитата Сообщение от Skipy Посмотреть сообщение
Ну так я же говорю - надо знать, как работает return

Code
1
2
3
4
5
6
7
 0 ldc #10 <foo>
 2 astore_0
 3 goto 10 (+7)
 6 astore_1
 7 goto 10 (+3)
10 ldc #11 <boo>
12 areturn
Как получить вот это дело? Куда нажимать?))
0
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
17.02.2014, 15:16
Цитата Сообщение от Skipy Посмотреть сообщение
Ну так я же говорю - надо знать, как работает return
Код Code
0 ldc #10 <foo>
*2 astore_0
*3 goto 10 (+7)
*6 astore_1
*7 goto 10 (+3)
10 ldc #11 <boo>
12 areturn
да уж, вот теперь то все стало понятно
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
17.02.2014, 15:22
Цитата Сообщение от _Den_ Посмотреть сообщение
Как получить вот это дело? Куда нажимать?))
Нажимать на эту ссылку: JClassLib. Ставите, загружаете класс, получаете байткод.

Можно проще. Натравливаете на класс javap -c, получаете то же самое, но не в красивом окошке, а в консоли.

Добавлено через 1 минуту
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
да уж, вот теперь то все стало понятно
Если присмотреться, то можно увидеть, сколько раз в методе фигурирует return и как до него доходит управление.
1
 Аватар для _Den_
161 / 157 / 29
Регистрация: 21.09.2013
Сообщений: 487
Записей в блоге: 2
17.02.2014, 15:24
А моё объяснение сильно унылое?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
17.02.2014, 15:35
М-да, тут еще надо логику оптимизатора понимать... Иногда он оставляет хвостовой return, иногда делает по ходу кода.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.02.2014, 15:52  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Ну так я же говорю - надо знать, как работает return
но по всем спекам и логике первый return не вызвал никаких исключений и находился в отработавшем блоке и по всем правилам должен был получить управление по завершению блока finally и вернуть foo,
но по причине того что finally реализовано не на уровне JVM, а на уровне компилятора, то компилятор заменяет его гоутушками равно как и брейк, а так как оптимизатор не настолько умён как должен был бы быть, то после отработки брейка он вместо передачи управления обратно на первый return идёт дальше по коду и выполняет второй return, что согласитесь несколько не соответствует логике
0
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
17.02.2014, 16:02
Цитата Сообщение от mutagen Посмотреть сообщение
finally реализовано не на уровне JVM, а на уровне компилятора
это как понять?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.02.2014, 16:07  [ТС]
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
это как понять?
функционал finally реализован в байткоде через набор goto

Добавлено через 3 минуты
к слову сказать все кто ответил "правильно" (сказал что будет boo) кроме Skipy, на самом деле ошиблись, так как по правилам синтаксиса языка должен был отработать foo, а boo отработал только из-за дефекта оптимизатора и особенностей реализайии finally блока

правильный ответ - должен быть foo, но из за багов-фич выведется boo
0
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
17.02.2014, 16:09
Цитата Сообщение от mutagen Посмотреть сообщение
по правилам синтаксиса языка должен был отработать foo, а boo отработал только из-за дефекта оптимизатора и особенностей реализайии finally блока
Цитата Сообщение от mutagen Посмотреть сообщение
ps: вопрос чисто академический, поэтому не стоит нести чушь про то что так писать негоже
***
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
17.02.2014, 16:11
Цитата Сообщение от mutagen Посмотреть сообщение
функционал finally реализован в байткоде через набор goto
А это как бы не тонкость оптимизации в данном случае? Я сейчас с разным кодом играюсь, смотрю, что оптимизатор с ним делает. Вот этот метод взял:

Java
1
2
3
4
5
6
7
static String tryFinally() {
    try {
        return "foo";
    } finally {
        System.out.println("finally");
    }
}
Результат:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
  0 ldc #11 <foo>
 2 astore_0
 3 getstatic #5 <java/lang/System.out>
 6 ldc #13 <finally>
 8 invokevirtual #9 <java/io/PrintStream.println>
11 aload_0
12 areturn
13 astore_1
14 getstatic #5 <java/lang/System.out>
17 ldc #13 <finally>
19 invokevirtual #9 <java/io/PrintStream.println>
22 aload_1
23 athrow
Тут четко видно, что system.out в коде ДВА раза. И я пока затрудняюсь сказать, почему
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.02.2014, 16:14  [ТС]
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
***
не пойму в чём вы усмотрели повод для улыбки ?

человек читающий код не обязан знать реализацию байткода в компиляторе, их вообще может быть тыщи, но так как де факто мы имеем дело с компилятором от sun->оракла, то у нас такое поведение, ничем кстати необоснованное, как и ваш юмор )))
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
17.02.2014, 16:22
у меня 1 return
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static dubleReturn()Ljava/lang/String;
    TRYCATCHBLOCK L0 L1 L2 null
   L0
    LINENUMBER 7 L0
   FRAME SAME
    LDC "foo"
    ASTORE 0
   L1
    LINENUMBER 9 L1
    GOTO L3
   L2
   FRAME SAME1 java/lang/Throwable
    ASTORE 1
    GOTO L3
   L3
    LINENUMBER 12 L3
   FRAME SAME
    LDC "doo"
    ARETURN
    MAXSTACK = 1
    MAXLOCALS = 2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.02.2014, 16:22
Помогаю со студенческими работами здесь

Что вернет length для двумерного массива?
я Java не изучаю.но анализируя один код на Java у меня возник вопрос. допустим задан двухмерный массив int mass какое значение...

Передать в метод "что-то", что бы метод мог в это "что-то" записать матрицу неизвестной размерности
Опишу суть проблемы подробнее. Есть метод, который умножает две матрицы, мне бы хотелось, что бы метод принимал в параметрах: 1....

Что вернёт метод простого класса
доброго времени суток. Имеем простой класс. import android.accounts.Account; import android.accounts.AccountManager; import...

Что вернет функция
Что вернет функция, проверяющая баланс скобок, если она принимает как параметр такую строку: ((х+y/z+у+(z/(y+z))-((0*z)-3) ...

Что вернет функция
Здравствуйте! Я вот С не знаю вообще, подскажите пожалуйста выполнится ли while при таком условии if (array_size == 0) return (0);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru