Java вернуться в положение N в стеке вызовов - PullRequest
1 голос
/ 05 мая 2010

Использование ключевого слова return в коде Java вернет выполнение к последнему фрагменту кода вызова в стеке вызовов. Если объект foo вызывает baz.bar(), ключевое слово return в методе bar продолжит выполнение кода в foo.

Допустим, у меня есть объект foo, который вызывает foofoo, который вызывает foofoofoo в приведенном выше сценарии, а foofoofoo вызывает baz.bar(). В любом случае в Java можно использовать ключевое слово return или что-то еще, чтобы код в методе bar мог полностью вернуться обратно до foo?

(БЕЗ ИСКЛЮЧЕНИЯ)

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

Нет, это невозможно. Вам придется обрабатывать это самостоятельно с помощью кода, по одному уровню за раз (исключение будет делать то же самое, оно просто немного автоматизировано).

Однако, в любом случае, это не очень хорошая идея. Предположим, что вам внезапно нужно позвонить baz.bar() из quux, не касаясь foo. Что теперь должно произойти, если bar пытается вернуться к foo, которого нет в стеке вызовов? Если вы просто хотите, чтобы он поднялся на N уровней, можете ли вы представить себе проблемы, которые могут возникнуть, если вы объедините foofoofoo в foofoo или измените его на добавление foofoofoofoo, не забывая изменить bar?

Исключение звучит в точности как правильный инструмент для этой работы: baz.bar() не должно заботиться о том, что оно должно перейти к foo, оно должно знать что-то исключительное произошло, требующее его прервать что он делает, и тогда foo должен знать, что эта исключительная ситуация может возникнуть, и справиться с ней (даже если в этом случае он просто ничего не делает). Чтобы избежать необходимости добавлять предложение throws ко всему, используйте вместо этого исключение без проверки.

1 голос
/ 05 мая 2010

К счастью, это невозможно в Java.

В редких случаях подобные вещи имеют смысл, например, когда вы переключаете контекст в ядре ОС.

Но это абсолютно неправильно в прикладных программах.

0 голосов
/ 05 мая 2010

Я не большой парень по Java, поэтому не могу сказать наверняка, но это не кажется безопасным, и я сомневаюсь, что это будет поддерживаться в Java.

Теперь, если бы это был C / C ++, вы могли бы сделать небольшой грязный хак, который бы переписал адрес возврата в стеке ...

...