Могу ли я узнать возвращаемое значение перед возвратом при отладке в Eclipse?

99

Можно ли увидеть возвращаемое значение метода после выполнения строки и до того, как указатель инструкции вернется в вызывающую функцию?

Я отлаживаю код, который не могу изменить (читайте: не хочу повторно компилировать стороннюю библиотеку) , и иногда он переходит к коду, для которого у меня нет источника, или возвращаемое выражение имеет побочные эффекты, которые мешают мне быть возможность просто запустить выражение на вкладке Display .

Часто возвращаемое значение используется в составном операторе, поэтому представление переменных никогда не покажет мне значение (следовательно, я хочу увидеть результат до того, как управление вернется к вызывающей функции).

ОБНОВЛЕНИЕ: я не могу использовать средство просмотра выражений, так как в инструкции есть побочные эффекты.

РодеоКлоун
источник
7
Вот почему я перешел на версию IntelliJ для сообщества - люди из Eclipse, похоже, просто не понимают, насколько это важно. (Если они когда-нибудь это исправят, я вернусь в тот день, когда он будет выпущен.)
@James Mitchell, похоже, отличная идея для плагина. Я добавлю это в свой список дел и постараюсь сделать это, когда найду время (не скоро)
IAdapter
@ user672348 Но как это сделать в IntelliJ IDEA?
Алексей Тигарёв
@AlexeyTigarev: IIRC, он просто отображается, когда вы выполняете «Step Return» (или эквивалент).
Blaisorblade
1
Готовьтесь к Eclipse Oxygen (дата выхода - середина 2017 года). Вехой M2 есть эта функция .
Абдул

Ответы:

36

Эта функция была добавлена ​​в Eclipse версии 4.7 M2 под ошибкой Eclipse 40912 .

Чтобы использовать это:

  • перешагнуть через returnинструкцию (используя «Step Over» или «Step Return»)
  • теперь первая строка в представлении переменных будет показывать результат оператора return, как «[оператор xxx] вернулся:»

См. Подробности в Eclipse Project Oxygen (4.7) M2 - Новое и заслуживающее внимания .

Sleske
источник
Я тоже. Мне не хватает этой функции при использовании Eclipse.
m24p
1
Впоследствии эта ошибка Eclipse была повторно обнаружена в конце 2009 года . Тем не менее, все еще ожидает исправления, никто не назначен и нет Target Milestone. :)
Марк А. Фитцджеральд
1
Это было исправлено в последних сборках Eclipse 4.7 (начиная с M2)
AbdullahC
1
Некоторую информацию о том, как использовать исправление, можно найти в New And Noteworthy for 4.7 M2. Ищите «Результат метода после пошаговых операций» здесь: eclipse.org/eclipse/news/4.7/M2
Джошуа Голдберг
@JoshuaGoldberg: Спасибо, что указали на это - я отредактировал это в ответ.
sleske
34

Нашел действительно хороший ярлык для этого. Выберите выражение, которое возвращает значение, и нажмите

Ctrl + Shift + D

Это отобразит значение оператора возврата. Это действительно полезно в тех случаях, когда вы не можете или не хотите вносить изменения только в целях отладки.

Надеюсь это поможет.

Примечание: не тестировал это со сторонними библиотеками, но с моим кодом он работает нормально. Проверено на Eclipse Java EE IDE для веб-разработчиков. Версия: Juno Service Release 1

Сатиш
источник
4
+1, потому что это работает не только для возвращаемых значений, но и для выражений в целом. Намного удобнее, чем использовать вкладку выражений. Следует отметить, что при этом выполняется код, поэтому будьте осторожны, если он имеет побочные эффекты. help.eclipse.org/indigo/…
goat
1
Ctrl + Shift + Iбыл также полезен для меня.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
2
как упоминалось в @goat, это выполняет код несколько раз, поэтому, например, если функция выполнила это return System.currentTimeMillis();, вы получите другой результат, чем фактически возвращенная функция!
Брэд Паркс,
Эквивалент на Apple machine?
Adrien Be
Это проблемный совет - это переоценивает выражение, что может иметь катастрофические последствия, если у него есть побочные эффекты.
sleske
5

Вот почему я всегда придерживаюсь следующего шаблона для методов:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Мои правила:

  1. Только один оператор возврата, только в конце метода (наконец разрешен после него)
  2. Всегда имейте локальный вызываемый результат, который содержит возвращаемое значение, начиная со значения по умолчанию.

Естественно, самые тривиальные геттеры не облагаются налогом.

Звикико
источник
3
Привет, звикико - когда я работаю над своим собственным кодом, я обычно использую похожий шаблон. К сожалению, моя проблема в том, что я использую код, который не написан и не изменен мной. : S
РодеоКлоун
Я тоже так делаю, но SonarLint жалуется .... теперь я двусмысленно: stackoverflow.com/questions/31733811/…
HDave
@WitoldKaczurba это ваше мнение, и это нормально. Просто примите то, что есть другие мнения, и проявите некоторое уважение к тем, кто их придерживается.
zvikico
Привет, звикко. Спасибо за сообщение. Я согласен с тем, что существуют разные подходы, но я сослался на pmd.sourceforge.io/pmd-4.3.0/rules/… . Ура
Витольд Качурба
2

Мне также любопытно узнать ответ на этот вопрос.

Раньше, имея дело с подобной сторонней библиотекой, я создавал класс-оболочку или дочерний класс, который делегировал родительскому классу и выполнял отладку в классе-оболочке / дочернем классе. Однако это требует дополнительной работы.

DJ.
источник
1
Проблема с этим решением (кроме того, что вы отметили о дополнительной работе) заключается в том, что оно работает, только если у вас нет нескольких классов / методов внутри внешней библиотеки. Но это полезно, когда вы имеете дело с внешним слоем методов.
RodeoClown
0

Крепкий орешек. Мой опыт вне Eclipse показывает, что если вам может потребоваться увидеть возвращаемое значение, лучше всего назначить его локальной переменной в функции, чтобы оператор return был простым, return varname;а не непростым return(some * expression || other);. Однако это не очень полезно для вас, поскольку вы говорите, что не можете (или не хотите) изменять или даже перекомпилировать код. Итак, у меня нет для вас хорошего ответа - возможно, вам нужно пересмотреть свое требование.

Джонатан Леффлер
источник
В моем коде у меня обычно есть промежуточный шаг, поэтому я могу проверить результат, но в некоторых кодах, которые я использую, слишком много организационных издержек для изменения (особенно, если библиотека обновляется, не очень хочу поддерживать разветвленную версию просто для отладки).
RodeoClown,
0

В зависимости от оператора return вы можете выделить возвращаемое выражение, а из контекстного меню должно быть что-то вроде «оценивать выражение» (сейчас передо мной нет затмения, но это что-то вроде этого ). Он покажет вам, что нужно вернуть.

Стефмара
источник
4
Проблема заключается в том, что оценка функции возврата имеет побочные эффекты (например, создаваемые записи в базе данных), оценка выражения возврата изменит состояние системы. Спасибо за предложение.
RodeoClown
0

Это немного надумано, но, похоже, нет простого способа:

Вы можете использовать AspectJ для оснащения JAR аспектами, которые получают возвращаемое значение методов, которые вас интересуют. Согласно документации Eclipse, программы AspectJ можно отлаживать, как и другие программы.

Есть два варианта создания ваших классов без перекомпиляции библиотеки:

  • Посткомпиляционное переплетение, если обработка двоичного JAR приемлема;

  • Ткачество во время загрузки, которое требует активации агента ткачества в виртуальной машине.

См. Документацию по eclipse (ссылка выше), а также Руководство по среде разработки AspectJ .

Оливье
источник