Wenn Sie vom try
Block zurückkehren, wird der Rückgabewert im Stapelrahmen für diese Methode gespeichert. Danach wird der finally-Block ausgeführt.
Durch Ändern des Werts im finally-Block wird der Wert auf dem Stapel nicht geändert. Wenn Sie jedoch erneut aus dem finally-Block zurückkehren, wird der Rückgabewert auf dem Stapel überschrieben und das neue x
wird zurückgegeben.
Wenn Sie den Wert von x
in endlich Block drucken, werden Sie erfahren, dass es ausgeführt wird, und der Wert x
wird gedruckt.
static int test(){
int x = 1;
try{
return x;
}
finally{
x = x + 1;
System.out.println(x); // Prints new value of x
}
}
Anmerkung: Bei einem Referenzwert zurückgeführt wird, wird der Wert der Referenz auf dem Stapel abgelegt. In diesem Fall können Sie den Wert des Objekts mithilfe dieser Referenz ändern.
StringBuilder builder = new StringBuilder("");
try {
builder.append("Rohit ");
return builder;
} finally {
// Here you are changing the object pointed to by the reference
builder.append("Jain"); // Return value will be `Rohit Jain`
// However this will not nullify the return value.
// The value returned will still be `Rohit Jain`
builder = null;
}
Empfohlene lesen:
Warum fügen Sie eine 'System.out.println()' zum finally Block hinzu und sehen Sie sich? Ich denke, es wird ausgeführt, aber der zurückgegebene Wert ist 1. –
Wenn Sie try catch verwenden, können Sie bestimmte Arten von Ausnahmen "fangen" (zB: IOException, NullPointerException etc ..) Die finally-Anweisung tritt auf, wenn die spezifische Ausnahme passiert und Sie müssen führe irgendeinen Code vor dem Fang aus ... – RicardoE
[Hier ist] (http://StackOverflow.com/questions/Tagged/Java+Return+Finally?Sort=votes&pagesize=40) etwas zum Nachdenken über – keyser