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

3voto

Akash Manngroliya Punkte 181

Ja, es wird immer aufgerufen, aber in einer Situation wird es nicht aufgerufen, wenn Sie System.exit() verwenden

try{
//risky code
}catch(Exception e){
//exception handling code
}
finally(){
//It always execute but before this block if there is any statement like System.exit(0); then this block not execute.
}

0 Stimmen

Doppelte Antwort

0 Stimmen

Nicht nur "doppelt", sondern auch widersprüchlich.

3voto

dibo Punkte 67

Dasselbe gilt für den folgenden Code:

static int f() {
    while (true) {
        try {
            return 1;
        } finally {
            break;
        }
    }
    return 2;
}

f wird 2 zurückkehren!

0 Stimmen

Doppelte Antwort

0 Stimmen

Dies zeigt jedoch, dass der finally-Block in jedem Fall ausgeführt wird.

3voto

HopefullyHelpful Punkte 1592

finally kann auch vorzeitig beendet werden, wenn ein Exception es throw n innerhalb einer verschachtelt finally Block . Der Compiler wird Sie warnen, dass die finally Block nicht normal abgeschlossen wird oder eine Fehlermeldung ausgibt, dass Sie unerreichbaren Code haben. Der Fehler für unerreichbaren Code wird nur angezeigt, wenn der throw nicht hinter einer bedingten Anweisung oder innerhalb einer Schleife steht.

try{
}finally{
   try{
   }finally{
      //if(someCondition) --> no error because of unreachable code
      throw new RunTimeException();
   }
   int a = 5;//unreachable code
}

1 Stimmen

Ich möchte nur darauf hinweisen, dass dies ein völlig normales Verhalten ist. Jeder Code wird vorzeitig beendet, wenn eine Ausnahme geworfen wird. Dies ist nicht anders als eine Ausnahme, die irgendwo anders ausgelöst wird. Es gibt keine spezielle Regel in der Spezifikation, die besagt, dass Ausnahmen nicht innerhalb eines finally-Blocks verwendet werden können. Aus diesem Grund habe ich sogar Ihre Antwort zunächst missverstanden und hätte fast -1 gegeben, bis ich sie ein paar Mal gelesen habe.

0 Stimmen

Aber was ist der Unterschied zwischen einer Rückgabe und einem Wurf? Wenn Sie zurückkehren, dann sollte der Block zurückkehren, aber in einem finally-Block wird die Rückkehr verschoben und es gibt einige seltsame Ausnahmen für die Rückkehr, so dass es nicht klar ist, dass finally throw in einer normalen Weise behandelt. Das ist der Hauptgrund, warum ich das damals geschrieben habe. Auch ein throw in einem try- oder catch-Block hindert den finally-Block nicht an der Ausführung, so dass man natürlich erwarten kann, dass ein throw in einem finally-Block trotzdem ausgeführt wird.

1 Stimmen

"Wie unterscheidet sich die Rückkehr vom Wurf?" Auf mehrere Arten, von denen keine hier relevant ist. In einem finally-Block wird return nicht aufgeschoben, oder meinten Sie, dass die Rückkehr im try-Block aufgeschoben wird, bis der finally-Block ausgeführt wird (in diesem Fall ist das richtig)? In jedem Fall gilt das Gleiche für geworfene Ausnahmen. Egal, was in einem try , wenn das Ende der try erreicht ist, geht die Kontrolle an finally dann gelten die gleichen Regeln auch für die finally (wobei alle try/catch innerhalb von finally wie üblich funktionieren).

3voto

Gala101 Punkte 454

Betrachten Sie dies bei einer normalen Ausführung (d.h. ohne dass eine Ausnahme ausgelöst wird): Wenn die Methode nicht 'void' ist, gibt sie immer explizit etwas zurück, wird aber schließlich immer ausgeführt

3voto

vodkhang Punkte 18481

Denn das Endspiel wird immer angerufen, egal welche Fälle Sie haben. Wenn Sie keine Ausnahme haben, wird es trotzdem aufgerufen, wenn Sie eine Ausnahme abfangen, wird es trotzdem aufgerufen.

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