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ß.
Ausgabe:
%Vor% 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.
return
-Anweisung im Hauptblock. Es unterbricht die Ausführung des Hauptblocks und prüft auf eine finally
-Klausel. finally
-Klausel in ihrer Gesamtheit einschließlich ihrer return
-Anweisung aus. 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.)
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.
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).
Tags und Links java return return-value try-catch-finally