Der tryBlock wird mit der Ausführung der returnAnweisung abgeschlossen, und der Wert szum Zeitpunkt der returnAusführung der Anweisung ist der von der Methode zurückgegebene Wert. Die Tatsache, dass die finallyKlausel später den Wert von s(nach Abschluss der returnAnweisung) ändert, ändert (zu diesem Zeitpunkt) den Rückgabewert nicht.
Beachten Sie, dass sich das Obige auf Änderungen des Werts von sich sselbst im finallyBlock sbezieht , nicht auf das Objekt, auf das verwiesen wird. Wenn sein Verweis auf ein veränderbares Objekt (was Stringnicht der Fall ist) und der Inhalt des Objekts im finallyBlock 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 returnAnweisung als abrupte Beendigung des tryBlocks 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 returnAnweisung eine abrupte Beendigung eines Blocks darstellt.
Zur weiteren Detaillierung: Wenn sowohl der tryBlock als auch der finallyBlock einer try-finallyAnweisung aufgrund von returnAnweisungen abrupt beendet werden , gelten die folgenden Regeln aus §14.20.2:
Wenn die Ausführung des tryBlocks aus einem anderen Grund abrupt beendet wird [außer eine Ausnahme auszulösen], wird der finallyBlock ausgeführt, und dann gibt es eine Auswahl:
- Wenn der
finallyBlock normal abgeschlossen wird, wird die tryAnweisung aus Grund R abrupt abgeschlossen.
- Wenn der
finallyBlock aus Grund S abrupt abgeschlossen wird, wird die tryAnweisung aus Grund S abrupt abgeschlossen (und Grund R wird verworfen).
Das Ergebnis ist, dass die returnAnweisung im finallyBlock den Rückgabewert der gesamten try-finallyAnweisung bestimmt und der vom tryBlock zurückgegebene Wert verworfen wird. Ähnliches gilt für eine try-catch-finallyAnweisung, wenn der tryBlock eine Ausnahme auslöst, von einem catchBlock abgefangen wird und sowohl der catchBlock als auch der finallyBlock returnAnweisungen haben.