NICHT IMMER
Die Java Language specification beschreibt, wie try
-catch
-finally
und try
-catch
Blöcke funktionieren unter 14.20.2
An keiner Stelle wird spezifiziert, dass der finally
Block immer ausgeführt wird. Für alle Fälle, in denen die try
-catch
-finally
und try
-finally
Blöcke vollständig ausgeführt werden, wird jedoch spezifiziert, dass vor Abschluss finally
ausgeführt werden muss.
try {
CODE im try Block
}
finally {
FIN Code im finally Block
}
Nächster Code wird nach dem try-finally Block ausgeführt (kann in einer anderen Methode sein).
Die JLS garantiert nicht, dass FIN nach CODE ausgeführt wird. Die JLS garantiert, dass wenn CODE und NEXT ausgeführt werden, dann wird FIN immer nach CODE und vor NEXT ausgeführt.
Warum garantiert die JLS nicht, dass der finally
Block immer nach dem try
Block ausgeführt wird? Weil es unmöglich ist. Es ist unwahrscheinlich, aber möglich, dass die JVM nach Abschluss des try
Blocks, aber vor der Ausführung des finally
Blocks abgebrochen wird (beendet, abstürzt, heruntergefahren wird). Hiergegen kann die JLS nichts tun.
Daher sind alle Software, die für ihr korrektes Verhalten von der Ausführung der finally
Blöcke nach Abschluss ihrer try
Blöcke abhängen, fehlerhaft.
return
Anweisungen im try
Block sind für dieses Problem irrelevant. Wenn die Ausführung den Code nach dem try
-catch
-finally
erreicht, ist garantiert, dass der finally
Block bereits ausgeführt wurde, mit oder ohne return
Anweisungen innerhalb des try
Blocks.
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!