it-swarm.com.de

Läuft ein final-Block auch dann, wenn Sie eine neue Exception werfen?

In diesem Code wird someVar gesetzt, auch wenn der catch-Block ausgeführt wird und die zweite Ausnahme ausgelöst wird.

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
121
jax

Ja, die endgültigen Blöcke laufen immer ... außer wenn:

  • Der Thread, der den try-catch-finally-Block ausführt, wird beendet oder unterbrochen 
  • Sie verwenden System.exit(0);
  • Das zugrunde liegende VM wird auf andere Weise zerstört
  • Die zugrunde liegende Hardware ist in gewisser Weise unbrauchbar

Wenn eine Methode in Ihrem finally-Block eine nicht erfasste Ausnahme auslöst, wird darüber hinaus nichts ausgeführt (d. H. Die Ausnahme wird wie in jedem anderen Code ausgelöst). Ein sehr häufiger Fall, in dem dies geschieht, ist Java.sql.Connection.close().

Abgesehen davon schätze ich, dass das von Ihnen verwendete Codebeispiel nur ein Beispiel ist, aber achten Sie darauf, die eigentliche Logik in einen finally-Block einzufügen. Der finally-Block ist für die Bereinigung von Ressourcen (Schließen von DB-Verbindungen, Freigeben von Dateikennungen usw.) vorgesehen, nicht für die Logik, die ein Muss ausführen muss. Wenn es vor dem try-catch-Block ausgeführt werden muss, muss es von etwas entfernt werden, das eine Ausnahme auslösen könnte, da Ihre Absicht fast sicher funktional identisch ist.

155
GaryF

Ja. 

Siehe die Dokumentation :

Der finally-Block always wird ausgeführt, wenn Der try-Block wird beendet.

Ausnahmen:

Hinweis: Wenn die JVM während des Versuchs __ beendet wird. oder catch code wird ausgeführt, dann Der finally-Block darf nicht ausgeführt werden . Ebenso, wenn der Thread die .__ ausführt. Try oder Catch-Code ist unterbrochen oder getötet, darf der endlich block nicht ausführen, obwohl die Anwendung als ein ganzes geht weiter.

9
froadie

Der finally-Block wird immer ausgeführt, wenn der try-Block beendet wird, es sei denn, Sie haben System.exit (0) in try oder catch.

1
urmalp

Ja. finally block wird immer ausgeführt, es sei denn, Sie rufen System.exit () auf, da Java Java VM angehalten wird.

1
Vladimir Ivanov

Schließlich wird der Block immer ausgeführt.

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

 Java Try Catch Finally Block with Throw 

0

Schließlich wird immer ausgeführt, egal in welchem ​​Fall Sie sich befinden 

  • try-catch-finally blockieren
  • wirft 

Bei ungeprüften Ausnahmen verlangt Java keine Fehlerbehandlung. Dies ist der Grund. Wenn dann eine ungeprüfte Ausnahme im finally-Block auftritt und keine Behandlung erfolgt, wird der unter diesem Punkt geschriebene Code (wo der Fehler aufgetreten ist) nicht ausgeführt hingerichtet.

Ich schlage daher vor, immer alle Ausnahmen zu behandeln, es kann also geprüft oder nicht angehakt werden. Auf diese Weise können Sie sicherstellen, dass der Codeblock schließlich auch ausgeführt wird, unabhängig davon, ob auch eine nicht geprüfte Ausnahme auftritt. Sie haben einen Platz im Subnest fangen und blockieren schließlich, um Ihre notwendige Arbeit zu erledigen.

0
yug