Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage
 <<    <     >    >>   API  Kapitel 13 - Exceptions

13.4 Automatisches Schließen von Ressourcen



Mit der Version 7 des JDK wurde das AutoCloseable-Interface eingeführt. Zudem wurde die try-catch-Klausel um den try-with-resources-Teil erweitert, in dem sich Objekte vom Typ AutoCloseable deklarieren lassen. Das Laufzeitsystem garantiert, dass für diese Objekte vor dem Austritt aus dem try-catch-Block die close-Methode aufgerufen wird.

Im JDK implementieren u.a. die Klassen InputStream, OutputStream, PrintStream, Socket, Connection, Statement, ResultSet sowie alle Reader und Writer dieses Interface.

 JDK6.0-7.0 

public void close() throws Exception
java.lang.AutoCloseable

Um den Nutzen dieses Konzepts zu erklären, greifen wir in dem folgenden Beispiel auf die Klasse FileInputStream zurück, um den Inhalt einer Datei zu lesen. Das Lesen aus einer Datei wird zwar erst in Kapitel 19 bzw. in Kapitel 20 erklärt. Wichtig an dieser Stelle ist dabei lediglich, dass nach Verwendung eines FileInputStream-Objekts die Methode close aufgerufen werden sollte, um die belegten Ressourcen wieder freizugeben.

Das Beispielprogramm liest die Datei test.txt ein und schließt das FileInputStream-Objekt im finally-Block durch den Aufruf der Methode close. Das erste Listing zeigt die Implementation mit der Java-Version 6; das zweite die vereinfachte Implementation, die ab Java Version 7 möglich ist.

001 /* Listing1312.java */
002 
003 import java.io.*;
004 
005 public class Listing1312
006 {
007   public static void main(String[] args) {
008     
009     FileInputStream fin = null;  
010     try {
011       fin = new FileInputStream("test.txt");
012       int b;
013       while ((b = fin.read()) > -1) {
014         // verarbeite b ...
015       }                          
016     }
017     catch (IOException e) {
018       e.printStackTrace();
019     }
020     finally {
021       if (fin != null) {
022         try {
023           fin.close();
024         }
025         catch (IOException e) {
026           e.printStackTrace();
027         }
028       }
029     }
030   }
031 }
Listing1312.java
Listing 13.12: Manuelles Schließen von Ressourcen mit dem JDK 6

Die fachliche Logik, Zeile 009 bis Zeile 015, geht in Listing 13.12 im Exception Handling regelrecht unter, u.a. deshalb, weil die close-Methode selbst wieder eine IOException werfen kann, die wiederum im finally-Block behandelt werden muss.

Mit Version 7 lässt sich das gleiche Programm viel übersichtlicher schreiben. Die (optionale) try-with-resources-Klausel folgt in runden Klammern nach dem try-Schlüsselwort und deklariert die Objekte, deren close-Methode automatisch aufgerufen werden soll. Werden mehrere AutoCloseable-Objekte deklariert, sind sie durch Semikolons voneinander zu trennen und werden ggfs. in umgekehrter Reihenfolge geschlossen.

In unserem Beispiel deklarieren wir in der try-with-resources-Klausel ein FileInputStream-Objekt:

001 /* Listing1313.java */
002 
003 import java.io.*;
004 
005 public class Listing1313
006 {
007   public static void main(String[] args) {
008     
009     try ( FileInputStream fin = new FileInputStream("test.txt") )
010     {
011       int b;
012       while ((b = fin.read()) > -1) {
013         // verarbeite b ...
014       }
015     }
016     catch (IOException e) {
017       e.printStackTrace();
018     }
019   }
020 }
Listing1313.java
Listing 13.13: Automatisches Schließen von Ressourcen mit dem JDK 7

Tritt im try-catch-Block eine Exception auf, ruft das System die close-Methoden der deklarierten AutoCloseable-Objekte auf und sorgt so dafür, dass alle belegten Ressourcen ordnungsgemäß freigegeben werden. Falls die close-Methoden ihrerseits Exceptions auslösen, werden diese unterdrückt.


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de