Heim >Java >javaLernprogramm >Der „finally'-Block in Java

Der „finally'-Block in Java

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-13 02:10:02640Durchsuche

El bloque finally en Java

Bei der Arbeit mit Ausnahmen in Java kommt es häufig vor, dass die Notwendigkeit besteht, einen Try-Catch-Block zu verwenden, um sie zu behandeln, und ihre Behandlung nicht einfach an denjenigen zu delegieren, der diesen Teil des Codes aufruft . Manchmal ist es jedoch erforderlich, bestimmte Aktionen auszuführen, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht oder ob der Programmausführungsablauf erfolgreich abgeschlossen wurde, z. B. das Schließen einer Datei, eine Verbindung zu einer Datenbank usw. .

In diesen Fällen wird der „finally“-Block verwendet. Dieser Block wird nach dem Catch-Block oder sogar nach dem Try-Block platziert, wenn kein Catch-Block verwendet wird. Der im „finally“-Block platzierte Code wird in zwei Szenarien ausgeführt:

  • Wenn der Try-Block endet und keine Ausnahme ausgelöst wurde.
  • Wenn eine Ausnahme auftritt, wird der Ausführungsfluss unterbrochen und der Catch-Block ausgeführt.

Beispiel 1

Betrachten wir eine Divisionsmethode, die zwei Ganzzahlen empfängt und das Ergebnis der Division zwischen ihnen zurückgibt. Dabei wird ein Try-Catch-Block verwendet, um die Ausnahme zu behandeln, die beim Versuch einer Division durch Null ausgelöst wird, sowie ein Final-Block, um eine Meldung auszugeben, die angibt, dass Ressourcen bereinigt werden.

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }

Durch Aufruf der Divide-Methode mit den Werten 10 und 2 erhält man folgende Ausgabe:

Cleaning up resources...
5

Wie wir sehen können, wurde keine Ausnahme ausgelöst, sodass die Methode das Ergebnis der Division zurückgab und der „finally“-Block ausgeführt wurde, obwohl die Ausgabe des „finally“-Blocks zuerst angezeigt wird. Wenn andererseits die Divisionsmethode mit den Werten 10 und 0 aufgerufen wird, wird die folgende Ausgabe erhalten:

Error: / by zero
Cleaning up resources...
Exception in thread "main" java.lang.ArithmeticException: / by zero ...

In diesem Fall wurde eine Ausnahme ausgelöst, sodass der Ausführungsfluss unterbrochen und der Catch-Block ausgeführt wurde. Bevor die Ausnahme jedoch erneut ausgelöst wurde, wurde der Final-Block ausgeführt. In beiden Beispielen haben wir gesehen, dass der „finally“-Block immer ausgeführt wird, unabhängig vom erhaltenen Ergebnis.

Beispiel 2

Die Hauptverwendung des „final“-Blocks besteht darin, Ressourcen freizugeben, die im try-Block verwendet wurden, z. B. das Schließen einer Datei, einer Datenbankverbindung oder einer Netzwerkverbindung. Um dies zu veranschaulichen, betrachten wir eine readFile-Methode, die den Inhalt einer Datei liest und die erste Zeile zurückgibt. Dabei wird ein Try-Catch-Block verwendet, um die Ausnahme zu behandeln, die ausgelöst wird, wenn die Datei nicht gelesen werden kann, sowie ein Final-Block, um die Datei zu schließen.

public static String readFile() throws IOException {
    FileReader reader = null;
    try {
        reader = new FileReader("file.txt");
        BufferedReader buffer = new BufferedReader(reader);
        return buffer.readLine();
    } catch (IOException e) {
        System.out.println("Error: " + e.getMessage());
        throw new RuntimeException(e);
    } finally {
        if (reader != null) reader.close();
    }
}

Falls die readFile-Methode ausgeführt wird und die Datei nicht gelesen werden kann, wird die folgende Ausgabe erhalten:

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }

Wie wir sehen können, wurde eine Ausnahme ausgelöst, sodass der Ausführungsfluss unterbrochen und der Catch-Block ausgeführt wurde. Bevor die Ausnahme jedoch erneut ausgelöst wurde, wurde der Final-Block ausgeführt, um die Datei zu schließen. Wird hingegen eine file.txt-Datei mit dem Inhalt Hallo Welt! erstellt? und die readFile-Methode aufgerufen wird, wird die folgende Ausgabe erhalten, ohne dass eine Ausnahme ausgelöst wird:

Cleaning up resources...
5

Einige Aspekte, die in diesem Beispiel berücksichtigt werden müssen, sind:

  • Die Reader-Variable wurde außerhalb des Try-Blocks deklariert, sodass vom Final-Block aus auf sie zugegriffen werden kann, d. h. sie liegt im Gültigkeitsbereich beider Blöcke.
  • Überprüft, ob die Reader-Variable sich von Null unterscheidet, bevor versucht wird, die Datei zu schließen, denn wenn die Datei nicht geöffnet werden kann, bleibt diese Variable null und löst beim Versuch, sie zu schließen, eine Ausnahme aus.
  • Die mögliche Ausnahme, die die Methode „close“ auslösen kann, wenn sie versucht, die Datei innerhalb des „final“-Blocks zu schließen, wird nicht behandelt und in der Methodensignatur weitergegeben. Falls Sie sie behandeln möchten, können Sie sie in einen Try-Catch einschließen Block innerhalb des „finally“-Blocks.

Abschluss

Die Verwendung von „finally“ in Java ist so weit verbreitet, dass die Sprache selbst eine Alternative hat, die es uns ermöglicht, die Ressourcenverwaltung zu vereinfachen, den Try-with-Resources-Block. Dieser Block ist dafür verantwortlich, dass die Ressourcen am Ende ihrer Nutzung automatisch geschlossen werden. Daher ist es nicht erforderlich, einen „finally“-Block zum Freigeben der Ressourcen zu verwenden. Es ist jedoch wichtig zu beachten, dass der „finally“-Block in bestimmten Fällen immer noch nützlich ist und beide Optionen zusammen verwendet werden können.

Das obige ist der detaillierte Inhalt vonDer „finally'-Block in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn