Kann ich den Rückgabewert ermitteln, bevor ich beim Debuggen in Eclipse zurückkehre?

99

Ist es möglich, den Rückgabewert einer Methode zu sehen, nachdem die Zeile ausgeführt wurde und bevor der Anweisungszeiger zur aufrufenden Funktion zurückkehrt?

Ich debugge Code, den ich nicht ändern kann (lesen Sie: Ich möchte keine Bibliothek eines Drittanbieters neu kompilieren) , und manchmal springt er zu Code, für den ich keine Quelle habe, oder der Rückgabeausdruck hat Nebenwirkungen, die mich davon abhalten, zu sein Sie können den Ausdruck einfach auf der Registerkarte Anzeige ausführen .

Oft wird der Rückgabewert in einer zusammengesetzten Anweisung verwendet, und daher zeigt mir die Variablenansicht niemals den Wert an (daher möchte ich das Ergebnis sehen, bevor das Steuerelement zur aufrufenden Funktion zurückkehrt).

UPDATE: Ich kann den Ausdrucks-Viewer nicht verwenden, da die Anweisung Nebenwirkungen enthält.

RodeoClown
quelle
7
Deshalb habe ich zur Community-Version von IntelliJ gewechselt - die Eclipse-Leute scheinen einfach nicht zu verstehen, wie wichtig dies ist. (Wenn sie es jemals reparieren, werde ich den Tag zurückschalten, an dem es veröffentlicht wird.)
@ James Mitchell das sieht nach einer großartigen Idee für ein Plugin aus. Ich werde es meiner ToDo-Liste hinzufügen und versuchen, es zu tun, wenn ich Zeit finde (nicht bald)
IAdapter
@ user672348 Aber wie geht das in IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, es wird nur angezeigt, wenn Sie "Step Return" (oder das Äquivalent) ausführen.
Blaisorblade
1
Machen Sie sich bereit für Eclipse Oxygen (Erscheinungsdatum Mitte 2017). Der M2-Meilenstein enthält diese Funktion .
Abdull

Antworten:

35

Diese Funktion wurde zu Eclipse Version 4.7 M2 unter dem Eclipse-Fehler 40912 hinzugefügt .

Um es zu benutzen:

  • Schritt über die return Anweisung (mit "Step Over" oder "Step Return")
  • Jetzt zeigt die erste Zeile in der Variablenansicht das Ergebnis der return-Anweisung als "[Anweisung xxx] zurückgegeben:"

Weitere Informationen finden Sie unter Eclipse Project Oxygen (4.7) M2 - Neu und bemerkenswert .

sleske
quelle
Ich auch. Ich vermisse diese Funktion bei der Verwendung von Eclipse.
m24p
1
Dieser Eclipse-Fehler wurde Ende 2009 erneut geöffnet . Ich warte jedoch immer noch auf eine Lösung, ohne dass jemand zugewiesen wurde und ohne Zielmeilenstein. :)
Mark A. Fitzgerald
1
Dies wurde in den letzten Builds von Eclipse 4.7 (ab M2) behoben
AbdullahC
1
Einige Informationen zur Verwendung des Fixes finden Sie unter Neu und bemerkenswert für 4.7 M2. Suchen Sie hier nach "Methodenergebnis nach Schrittoperationen
Joshua Goldberg
@JoshuaGoldberg: Danke, dass Sie darauf hingewiesen haben - ich habe es in der Antwort bearbeitet.
Sleske
34

Habe dafür eine wirklich gute Abkürzung gefunden. Wählen Sie den Ausdruck aus, der den Wert zurückgibt, und drücken Sie

Ctrl + Shift + D

Dies zeigt den Wert der return-Anweisung an. Dies ist sehr hilfreich in Fällen, in denen Sie Änderungen nicht nur zum Debuggen vornehmen können oder möchten.

Hoffe das hilft.

Hinweis: Habe dies nicht mit Bibliotheken von Drittanbietern getestet, aber es funktioniert gut für meinen Code. Getestet auf Eclipse Java EE IDE für Webentwickler. Version: Juno Service Release 1

Satish
quelle
4
+1, da dies nicht nur für Rückgabewerte funktioniert, sondern für Ausdrücke im Allgemeinen. Viel bequemer als die Verwendung der Registerkarte Ausdrücke. Es sollte beachtet werden, dass dies den Code ausführt. Wenn es also Nebenwirkungen hat, seien Sie vorsichtig. help.eclipse.org/indigo/…
Ziege
1
Ctrl + Shift + Iwar auch hilfreich für mich.
Ciro Santilli 法轮功 冠状 病 六四 事件 25
2
Wie bei @goat erwähnt, wird der Code mehrmals ausgeführt. Wenn die Funktion dies beispielsweise tut, return System.currentTimeMillis();erhalten Sie ein anderes Ergebnis als die tatsächlich zurückgegebene Funktion!
Brad Parks
Äquivalent auf einem Apple machine?
Adrien Be
Dies ist ein problematischer Rat - dies wird den Ausdruck neu bewerten, was katastrophal sein kann, wenn er Nebenwirkungen hat.
Sleske
5

Deshalb halte ich mich bei den Methoden immer an das folgende Muster:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Meine Regeln:

  1. Nur eine return-Anweisung, nur am Ende der Methode (danach endlich erlaubt)
  2. Haben Sie immer ein lokal aufgerufenes Ergebnis, das den zurückgegebenen Wert enthält, beginnend mit einem Standardwert.

Natürlich sind die trivialsten Getter davon ausgenommen.

zvikico
quelle
3
Hey zvikico - wenn ich an meinem eigenen Code arbeite, verwende ich normalerweise ein ähnliches Muster. Leider ist mein Problem, wenn ich Code verwende, der nicht von mir geschrieben oder geändert werden kann. : S
RodeoClown
Ich mache das auch, aber SonarLint beschwert sich ... jetzt bin ich nicht eindeutig
HDave
@WitoldKaczurba das ist deine Meinung und das ist in Ordnung. Akzeptieren Sie einfach, dass es andere Meinungen gibt, und zeigen Sie denen, die dies tun, etwas Respekt.
Zvikico
Hallo zvikco. Danke für die Nachricht. Ich akzeptiere, dass es verschiedene Ansätze gibt, aber ich habe auf pmd.sourceforge.io/pmd-4.3.0/rules/… verwiesen . Prost
Witold Kaczurba
2

Ich bin gespannt darauf, auch die Antwort auf diese Frage zu erfahren.

In der Vergangenheit habe ich beim Umgang mit solchen Bibliotheken von Drittanbietern eine Wrapper-Klasse oder eine untergeordnete Klasse erstellt, die an die übergeordnete Klasse delegiert und mein Debugging in der Wrapper / untergeordneten Klasse durchgeführt. Es erfordert jedoch zusätzliche Arbeit.

DJ.
quelle
1
Das Problem bei dieser Lösung (abgesehen von der, die Sie über zusätzliche Arbeit bemerkt haben) ist, dass sie nur funktioniert, wenn Sie nicht mehrere Klassen / Methoden tief in einer externen Bibliothek haben. Es ist jedoch nützlich, wenn Sie sich mit der äußeren Ebene von Methoden befassen.
RodeoClown
0

Schwierig. Außerhalb von Eclipse habe ich die Erfahrung gemacht, dass es am besten ist, den Rückgabewert einer lokalen Variablen in der Funktion zuzuweisen, damit die Rückgabeanweisung einfach ist return varname;und nicht return(some * expression || other);. Dies ist jedoch für Sie nicht besonders hilfreich, da Sie sagen, dass Sie den Code nicht ändern oder sogar neu kompilieren können (oder wollen). Ich habe also keine gute Antwort für Sie - vielleicht müssen Sie Ihre Anforderung überdenken.

Jonathan Leffler
quelle
In meinem Code habe ich im Allgemeinen den Zwischenschritt, damit ich das Ergebnis überprüfen kann, aber ein Teil des von mir verwendeten Codes hat zu viel organisatorischen Aufwand, um geändert zu werden (insbesondere, wenn die Bibliothek aktualisiert wird, möchte ich keine gespaltene Version beibehalten nur zum Debuggen).
RodeoClown
0

Abhängig von der return-Anweisung können Sie den zurückgegebenen Ausdruck markieren. Im Kontextmenü sollte sich so etwas wie "Ausdruck auswerten" befinden (ich habe jetzt keine Sonnenfinsternis vor mir, aber es ist so ähnlich ). Es zeigt Ihnen, was zurückgegeben wird.

stephmara
quelle
4
Das Problem besteht darin, dass bei der Auswertung der Rückgabefunktion Nebenwirkungen auftreten (z. B. beim Erstellen von Datenbankeinträgen). Durch die Auswertung des Rückgabeausdrucks wird der Systemstatus geändert. Vielen Dank für den Vorschlag.
RodeoClown
0

Dies ist ein bisschen weit hergeholt, aber da es keinen einfachen Weg zu geben scheint:

Sie können AspectJ verwenden, um die JAR mit Aspekten zu instrumentieren, die den Rückgabewert der Methoden erfassen, an denen Sie interessiert sind. Gemäß der Dokumentation von Eclipse können AspectJ-Programme wie andere Programme debuggt werden.

Es gibt zwei Möglichkeiten, Ihre Klassen zu weben, ohne die Bibliothek neu zu kompilieren:

  • Weben nach dem Kompilieren, wenn die Verarbeitung der binären JAR akzeptabel ist;

  • Ladezeitweben, für das ein Webmittel in der VM aktiviert werden muss.

Weitere Informationen finden Sie in der Eclipse-Dokumentation (Link oben) sowie im AspectJ Development Environment Guide .

Olivier
quelle