59. Ausnahmebehandlung: Design Guide
Stets fragen: Bin ich schuld (für das Auftreten eines möglichen Ausnahmefehlers) bzw. muss ich das lösen?
Unchecked Exception: für Bug bzw. Programmierfehler (vermeidbar) -> Programm wird gezielt zum Absturz gebracht um Bug zu identifizieren (durch Stacktrace). Typische unchecked exceptions: IllegalArgumentException, NullPointerException
Checked Exception: für nicht vermeidbare Fehler (z.B. Hardwareproblem oder User-Eingaben) (nicht zu erkennen beim Kompilieren) -> muss behandelt werden, kann aber bis zur höchsten Instanz weitergereicht werden. Hier sollten möglichst eigene Exceptions verwendet werden.
Wenn der Fehler weitergereicht wird abermals in der die Exception gefangene Methode fragen: Bin ich schuld?
Bei Bugs sollen stets unchecked exceptions verwendet werden, da diese nicht behandelt werden und somit zum Programmabsturz führen. Zur Laufzeit sollen so Bugs erkannt werden.
Vorteil von unchecked exceptions im Vergleich zu Ausgaben auf der Konsole mit Programmende: Durch den Stacktrace weiß ich stets, wo im Programm der Fehler verursacht wurde.
Es sollte stets eine möglichst aussagekräftige Exception verwendet werden, damit der Fehler schneller klar wird.
Erstellen einer eigenen Exception:
public class TunenException extends RuntimeException{
public TunenException(){
}
public TunenException(String msg){
super(msg);
}
public TunenException(Throwable t){
super(t);
}
public TunenException(String msg, Throwable t){
super(msg, t);
}
}
Die vier Standardkonstruktoren definieren.
Stack trace:
Exception in thread "main" klassen.TunenException: Der Tunewert darf nichtnegativ sein
at klassen.Fahrzeug.tunenMitEx(Fahrzeug.java:58)
at programme.FahrzeugDemo.main(FahrzeugDemo.java:14)
Je weiter oben, desto weiter oben im Stack (neue Aufrufe werden auf den Stack gelegt).
Hier: FahrzeugDemo.java:14 -> ruft auf -> Fahrzeug.tunenMitEx -> erzeugt TunenException (Der Tunewert darf nicht negativ sein).
Faustregel: Ein Stacktrace sollte stets gemacht werden, wenn eine (harmlose) Exception nicht behandelt wird, sondern lediglich abgefangen wird, um einen Softwareabsturz zu vermeiden.
Checked Exception werden dann geworfen, wenn Fehler zur Laufzeit auftreten, die nicht verhindert werden können (z.B. Hardwareproblem), d.h. es muss ein try-catch Block erzeugt werden.