try-with-resources / context managers
Klausur-Klassiker. Bei Ressourcen (Datei, DB-Verbindung, Stream) MUSS man hinterher schließen — auch im Fehlerfall.
Alte Methode (Java vor 7):
FileReader fr = null;
try {
fr = new FileReader("data.txt");
// arbeit damit...
} finally {
if (fr != null) fr.close(); // muss in finally!
}
Neu (try-with-resources):
try (FileReader fr = new FileReader("data.txt")) {
// arbeit damit...
}
// fr.close() wird AUTOMATISCH aufgerufen — auch bei Exception
Voraussetzung: die Ressource muss AutoCloseable implementieren. Viele Standard-Klassen tun das (Reader, Writer, Stream, Connection).
In Python macht das with:
with open("data.txt") as f:
# arbeit damit...
# f.close() wird AUTOMATISCH aufgerufen
Best Practices
❌ Nicht alles fangen
try {
// 200 Zeilen Code
} catch (Exception e) {
// alles still abfangen
}
So versteckst du Bugs. Du weißt nie was schief lief.
❌ Exception schlucken
try {
// ...
} catch (IOException e) {
// do nothing ← BAD
}
Mindestens loggen. Sonst verschwindet der Fehler spurlos.
✅ Spezifisch fangen
try {
Files.write(path, data);
} catch (FileNotFoundException e) {
// Datei nicht da → Default benutzen
} catch (IOException e) {
// anderes I/O-Problem → höher melden
throw new RuntimeException("I/O-Fehler", e);
}
✅ try-Blöcke klein halten
Nur die Zeile in try, die die Exception werfen kann. Nicht 100 Zeilen.
✅ Exceptions sind kein Kontrollfluss
// SCHLECHT — Exception zur Kontrollfluss-Steuerung
try {
int x = Integer.parseInt(s);
return x;
} catch (NumberFormatException e) {
return 0; // "wenn nicht parsable, dann 0"
}
// BESSER — vorher prüfen
if (s.matches("-?\\d+")) {
return Integer.parseInt(s);
}
return 0;
Exceptions sind teuer (Stack-Trace zusammenbauen). Für normale Logik nicht geeignet.