Der try
Block wird mit der Ausführung der return
Anweisung abgeschlossen, und der Wert s
zum Zeitpunkt der return
Ausführung der Anweisung ist der von der Methode zurückgegebene Wert. Die Tatsache, dass die finally
Klausel später den Wert von s
(nach Abschluss der return
Anweisung) ändert, ändert (zu diesem Zeitpunkt) den Rückgabewert nicht.
Beachten Sie, dass sich das Obige auf Änderungen des Werts von sich s
selbst im finally
Block s
bezieht , nicht auf das Objekt, auf das verwiesen wird. Wenn s
ein Verweis auf ein veränderbares Objekt (was String
nicht der Fall ist) und der Inhalt des Objekts im finally
Block geändert wurden , werden diese Änderungen im zurückgegebenen Wert angezeigt.
Die detaillierten Regeln für die Funktionsweise finden Sie in Abschnitt 14.20.2 der Java-Sprachspezifikation . Beachten Sie, dass die Ausführung einer return
Anweisung als abrupte Beendigung des try
Blocks gilt (es gilt der Abschnitt " Wenn die Ausführung des try-Blocks aus einem anderen Grund abrupt abgeschlossen wird ... "). In Abschnitt 14.17 des JLS erfahren Sie, warum eine return
Anweisung eine abrupte Beendigung eines Blocks darstellt.
Zur weiteren Detaillierung: Wenn sowohl der try
Block als auch der finally
Block einer try-finally
Anweisung aufgrund von return
Anweisungen abrupt beendet werden , gelten die folgenden Regeln aus §14.20.2:
Wenn die Ausführung des try
Blocks aus einem anderen Grund abrupt beendet wird [außer eine Ausnahme auszulösen], wird der finally
Block ausgeführt, und dann gibt es eine Auswahl:
- Wenn der
finally
Block normal abgeschlossen wird, wird die try
Anweisung aus Grund R abrupt abgeschlossen.
- Wenn der
finally
Block aus Grund S abrupt abgeschlossen wird, wird die try
Anweisung aus Grund S abrupt abgeschlossen (und Grund R wird verworfen).
Das Ergebnis ist, dass die return
Anweisung im finally
Block den Rückgabewert der gesamten try-finally
Anweisung bestimmt und der vom try
Block zurückgegebene Wert verworfen wird. Ähnliches gilt für eine try-catch-finally
Anweisung, wenn der try
Block eine Ausnahme auslöst, von einem catch
Block abgefangen wird und sowohl der catch
Block als auch der finally
Block return
Anweisungen haben.