Verstehen try fangen schließlich mit return und Wert, den es zurückgibt

8

Ich habe das folgende Stück Code.

%Vor%

Der Ausgang dafür ist

%Vor%

Wenn ich meinen finally Block ändere, um nichts wie

zurückzugeben %Vor%

Dann ist die Ausgabe

%Vor%

Jetzt verstehe ich, dass schließlich immer ausgeführt wird, außer wenn wir system.exit (0) aufrufen; aufgerufen oder die JVM stürzt ab. Was ich nicht verstehen kann ist, warum sich der Rückgabewert geändert hat? Ich würde immer noch erwarten, dass es den Wert des try-Blocks zurückgibt. Kann jemand erklären, warum der finally-Wert berücksichtigt wird und nicht der Rückgabewert des try-Blocks?

Bitte unterlassen Sie die Beantwortung, da schließlich ausgeführt wird, selbst wenn es einen Rückgabewert in try-Block gibt ... oder schließlich nur ausgeführt wird, wenn es ein system.exit (0) gibt; aufgerufen oder die JVM stürzt ab. wie ich das weiß.

BEARBEITEN

(nach Dirk Kommentar zu dies ) %Vor%

Ausgabe:

%Vor%     
StackFlowed 30.10.2014, 16:52
quelle

3 Antworten

15

Kurz bevor Sie vom Hauptblock zurückkehren, muss die JVM sicherstellen, dass der finally -Block ausgeführt wird. Die Idee ist, den finally -Block auszuführen und dann zurückzukommen und die return -Anweisung vom Hauptblock auszuführen. Wenn Sie jedoch eine return -Anweisung im Block finally haben, wird sie ausgeführt, wenn der finally -Block ausgeführt wird ... was bedeutet, dass die Steuerung niemals zum Hauptblock zurückkehrt, um die return -Anweisung abzuschließen.

  1. Die JVM findet die return -Anweisung im Hauptblock. Es unterbricht die Ausführung des Hauptblocks und prüft auf eine finally -Klausel.
  2. Es führt die finally -Klausel in ihrer Gesamtheit einschließlich ihrer return -Anweisung aus.
  3. Es wird niemals den try -Block vervollständigen.

Beachten Sie jedoch, dass der try -Baustein return ausdruck ausgewertet ist und dann verworfen wird. Dies ist wichtig, wenn es Nebenwirkungen hat. Wenn Ihr Hauptblock also return i++ hat, hat dies keine Auswirkungen auf den Rückgabewert, aber i wird immer noch inkrementiert. (Danke an Dirk , dass du darauf hingewiesen hast.)

    
chiastic-security 30.10.2014, 16:56
quelle
2

Wenn Sie endlich wiederkommen, ist das die letzte Rückkehr.

Das ist nicht überraschend. Es ist tatsächliches Verhalten. Rückgabewert, der bei finally block entschieden wird.

Wenn Sie schließlich nichts zurückgeben, ist der vorherige Wert, der zum Rückgabewert führt, der Rückgabewert (in Ihrem Fall der try-Blockwert).

Unabhängig davon, was Sie in try tun, wird der finally-Block immer ausgeführt, auch wenn Sie von Ihrem try-Block zurückkehren (Wenn Sie schließlich zurückkehren, ist das die letzte Rückkehr).

Von finally Dokumentation

  

Das Laufzeitsystem führt immer die Anweisungen innerhalb des finally-Blocks unabhängig davon aus, was innerhalb des try-Blocks passiert . Es ist also der perfekte Ort, um Aufräumarbeiten durchzuführen.

Hinweis: Endlich entworfen, um aufzuräumen.

    
quelle
2

In Java der Code:

%Vor%

wird vom Compiler in:

umgeschrieben %Vor%

Grundsätzlich kompiliert der Compiler den Code im finally -Block genau einmal in jedem Ausführungspfad, der dazu führen würde, dass die Codeausführung den geschützten Block verlässt, entweder über return , throw oder durchfall. Beachten Sie, dass einige Sprachen einen return innerhalb von einem finally Block nicht zulassen, Java jedoch nicht; Wenn ein finally -Block als Folge einer Exception ausgeführt wird, kann ein return innerhalb des Blocks jedoch dazu führen, dass die Exception stillschweigend abgebrochen wird (siehe obigen Code mit der Aufschrift "Code vor dem erneuten Dekodieren ausgeführt"; if Die return 3; wird ausgeführt, der erneute Wurf wird übersprungen).

    
supercat 02.11.2014 20:36
quelle