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:
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.
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 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!