Hier sind die offiziellen Worte aus der Java Language Specification.
14.20.2. Ausführung von try-finally und try-catch-finally
Ein try
-Anweisung mit einem finally
-Block wird ausgeführt, indem zuerst der try
-Block ausgeführt wird. Dann gibt es eine Wahl:
- Wenn die Ausführung des
try
-Blocks normal abgeschlossen wird, [...]
- Wenn die Ausführung des
try
-Blocks abrupt abgebrochen wird wegen eines throw
eines Wertes V, [...]
- Wenn die Ausführung des
try
-Blocks aus beliebigen anderen Gründen abrupt abgeschlossen wird R, dann wird der finally
-Block ausgeführt. Dann gibt es eine Wahl:
- Wenn der finally-Block normal abgeschlossen wird, wird die
try
-Anweisung abrupt aus dem Grund R abgeschlossen.
- Wenn der
finally
-Block abrupt aus dem Grund S abgeschlossen wird, wird die try
-Anweisung abrupt aus dem Grund S abgeschlossen (und Grund R wird verworfen).
Die Spezifikation für return
macht dies tatsächlich explizit:
JLS 14.17 Die return-Anweisung
ReturnStatement:
return Expression(opt) ;
Ein return
-Anweisung ohne Expression
versucht, die Steuerung an den Aufrufer der Methode oder des Konstruktors zu übertragen, die sie enthält.
Eine return
-Anweisung mit einer Expression
versucht, die Steuerung an den Aufrufer der Methode zu übertragen, die sie enthält; der Wert des Expression
wird zum Wert des Methodenaufrufs.
Die vorherigen Beschreibungen sagen "versucht, die Steuerung zu übertragen" anstatt einfach "überträgt die Steuerung", weil wenn es irgendwelche try
-Anweisungen innerhalb der Methode oder des Konstruktors gibt, deren try
-Blöcke die return
-Anweisung enthalten, dann werden alle finally
-Klauseln dieser try
-Anweisungen, von innerster zu äußerster, in Reihenfolge ausgeführt, bevor die Steuerung an den Aufrufer der Methode oder des Konstruktors übertragen wird. Ein abruptes Ende einer finally
-Klausel kann die Steuerungsübertragung, die durch eine return
-Anweisung initiiert wurde, stören.
672 Stimmen
Wenn dies nicht der Fall ist, sollte das Schlüsselwort wie folgt lauten
probably
stattdessen.61 Stimmen
Nicht siempre
3 Stimmen
Effektives Java sagt etwas anderes informit.com/articles/article.aspx?p=1216151&seqNum=7
38 Stimmen
@BinoyBabu, Abschlussbericht !=
finally
; Abschlussbericht \== diefinalize()
Methode.5 Stimmen
@Boann Richtig, "nicht immer" in der Tat. Aber dann können Sie nie und nimmer die Worte "garantiert" oder "immer" verwenden.
2 Stimmen
@Boann Ich würde es so formulieren: Der Ausführungsfluss geht immer durch finally, bevor er die try-finally-Struktur verlässt. Wenn er darin stirbt, ist das für mich in Ordnung, denn der Hauptzweck von finally ist es, sicherzustellen, dass die Dinge für andere Teile des Codes nicht durcheinander gebracht werden.
0 Stimmen
Sieht aus, als hättest du da einen ganz schönen Fisch gefangen!
0 Stimmen
Wenn die
finally
Block einen Wert zurückgibt, dann kann der try/catch-Block nicht zurückkehren.0 Stimmen
@NoonSilk Das war saukomisch!