2697 Stimmen

Wird ein finally-Block in Java immer ausgeführt?

Bei diesem Code kann ich sicher sein, dass der finally-Block immer ausgeführt wird, egal was something() ist?

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("Ich weiß nicht, ob das ausgegeben wird");
}

672 Stimmen

Wenn dies nicht der Fall ist, sollte das Schlüsselwort wie folgt lauten probably stattdessen.

61 Stimmen

3 Stimmen

Effektives Java sagt etwas anderes informit.com/articles/article.aspx?p=1216151&seqNum=7

10voto

bikz05 Punkte 1455

Kurz gesagt, in der offiziellen Java-Dokumentation (Klicke hier), steht geschrieben, dass -

Wenn die JVM beendet wird, während der try- oder catch-Code ausgeführt wird, kann der finally-Block möglicherweise nicht ausgeführt werden. Ebenso, wenn der Thread, der den try- oder catch-Code ausführt, unterbrochen oder beendet wird, kann der finally-Block nicht ausgeführt werden, obwohl die Anwendung als Ganzes weiterläuft.

10voto

Meet Vora Punkte 2653

Die Antwort ist einfach JA.

EINGABE:

try{
    int divideByZeroException = 5 / 0;
} catch (Exception e) {
    System.out.println("catch");
    return;    // habe auch mit break; in switch-case versucht, bekam die gleiche Ausgabe
} finally {
    System.out.println("finally");
}

AUSGABE:

catch
finally

2 Stimmen

Die Antwort ist ein einfaches NEIN.

1 Stimmen

@ChristopheRoussy Wie? Können Sie das bitte erklären?

1 Stimmen

Lesen Sie die akzeptierte Antwort, die ursprüngliche Frage lautet: "Wird es immer ausgeführt? In Ihrem Fall wird es ausgeführt, aber das beantwortet nicht die ursprüngliche Frage und kann sogar Anfänger in die Irre führen.

10voto

hellzone Punkte 5006

finally-Block wird immer ausgeführt und bevor der Wert von x (berechnet) zurückgegeben wird.

System.out.println("Wert von x aus foo() = " + foo());

...

int foo() {
  int x = 2;
  try {
    return x++;
  } finally {
    System.out.println("Wert von x in finally = " + x);
  }
}

Ausgabe:

Wert von x in finally = 3
Wert von x aus foo() = 2

0 Stimmen

Schönes anschauliches Beispiel, +1.

10voto

Mendelt Punkte 35649

Ja, es wird aufgerufen. Das ist der ganze Sinn eines finally-Schlüsselworts. Wenn das Verlassen des try/catch-Blocks einfach den finally-Block überspringen könnte, wäre es dasselbe, als ob das System.out.println außerhalb des try/catch-Blocks stehen würde.

10voto

Jay Riggs Punkte 52013

Weil ein finally-Block immer aufgerufen wird, es sei denn, Sie rufen System.exit() auf (oder der Thread stürzt ab).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X