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

7voto

Alex Miller Punkte 67243

Zusätzlich zu dem Punkt über die Rückkehr in finally, die eine Rückkehr im try-Block ersetzt, gilt das Gleiche für eine Ausnahme. Ein finally-Block, der eine Exception auslöst, ersetzt einen return oder eine Exception, die innerhalb des try-Blocks ausgelöst wurde.

7voto

Avinash Pande Punkte 1390
  1. Schließlich wird Block immer ausgeführt. Es sei denn, und bis System.exit() Anweisung existiert dort (erste Anweisung im finally-Block).
  2. Si system.exit() die erste Anweisung ist, wird der finally-Block nicht ausgeführt und die Kontrolle kommt aus dem finally-Block heraus. Wann immer die Anweisung System.exit() im finally-Block steht, wird der finally-Block ausgeführt, und wenn System.exit() erscheint, wird die Kontrolle vollständig aus dem finally-Block herausgeführt.

3 Stimmen

Diese Frage wurde bereits mehrfach beantwortet. Welche neuen Informationen fügt Ihre Antwort also hinzu?

6voto

Vikas Suryawanshi Punkte 494

Wenn Sie die Ausnahme nicht behandeln, führt die JVM vor der Beendigung des Programms den Block finally aus. I

  1. Indem sie einen schwerwiegenden Fehler verursachen, der zum Abbruch des Prozesses führt.

  2. Beendigung des Programms aufgrund eines beschädigten Speichers.

  3. Durch den Aufruf von System.exit()

  4. Wenn das Programm in eine Unendlichkeitsschleife geht.

6voto

Dávid Horváth Punkte 3744

Ja, denn keine Kontrollanweisung können verhindern finally vor der Ausführung.

Hier ist ein Referenzbeispiel, bei dem alle Codeblöcke ausgeführt werden:

| x | Current result | Code 
|---|----------------|------ - - -
|   |                |     
|   |                | public static int finallyTest() {
| 3 |                |     int x = 3;
|   |                |     try {
|   |                |        try {
| 4 |                |             x++;
| 4 | return 4       |             return x;
|   |                |         } finally {
| 3 |                |             x--;
| 3 | throw          |             throw new RuntimeException("Ahh!");
|   |                |         }
|   |                |     } catch (RuntimeException e) {
| 4 | return 4       |         return ++x;
|   |                |     } finally {
| 3 |                |         x--;
|   |                |     }
|   |                | }
|   |                |
|---|----------------|------ - - -
|   | Result: 4      |

In der untenstehenden Variante, return x; wird übersprungen. Das Ergebnis ist immer noch 4 :

public static int finallyTest() {
    int x = 3;
    try {
        try {
            x++;
            if (true) throw new RuntimeException("Ahh!");
            return x; // skipped
        } finally {
            x--;
        }
    } catch (RuntimeException e) {
        return ++x;
    } finally {
        x--;
    }
}

Die Referenzen geben natürlich Auskunft über ihren Status. Dieses Beispiel gibt eine Referenz mit value = 4 :

static class IntRef { public int value; }
public static IntRef finallyTest() {
    IntRef x = new IntRef();
    x.value = 3;
    try {
        return x;
    } finally {
        x.value++; // will be tracked even after return
    }
}

6voto

Bhushan Punkte 17263

Wenn eine Ausnahme ausgelöst wird, wird finally ausgeführt. Wenn eine Ausnahme nicht ausgelöst wird, wird finally ausgeführt. Wenn die Ausnahme abgefangen wird, wird finally ausgeführt. Wenn die Ausnahme nicht abgefangen wird, wird finally ausgeführt.

Es wird nur dann nicht ausgeführt, wenn die JVM beendet wird.

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