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