9.8 Harte Fehler – Error *
Klassen, die von java.lang.Error abgeleitet sind, repräsentieren harte Fehler, die mit der JVM in Verbindung stehen. Anders reagieren dagegen die von Exception abgeleiteten Klassen – sie stehen für allgemeine Programmfehler. Beispiele für konkrete Error-Klassen sind:
-
AnnotationFormatError
-
AssertionError
-
AWTError
-
CoderMalfunctionError[ 193 ](Die lustigste Fehlerklasse, wie ich finde. Sie könnte bei einigen Entwicklern bei jeder Methode ausgelöst werden. )
-
FactoryConfigurationError (XML-Fehler)
-
IOError
-
LinkageError (mit vielen Unterklassen)
-
ThreadDeath, TransformerFactoryConfigurationError (XML-Fehler)
-
VirtualMachineError (mit den Unterklassen InternalError, OutOfMemoryError, StackOverflowError, UnknownError)
Im Fall von ThreadDeath lässt sich ableiten, dass nicht alle Error-Klassen auf »Error« enden. Das liegt sicherlich auch daran, dass das nicht ein Fehler im eigentlichen Sinne ist, denn die JVM löst ThreadDeath aus, wenn das Programm einen Thread mit stop() beenden will.
Da ein Error »abnormales« Verhalten anzeigt, müssen Operationen, die einen solchen Fehler auslösen können, auch nicht in einem try-Block sitzen oder mit throws nach oben weitergegeben werden (Error-Fehler zählen zu den nichtgeprüften Ausnahmen, obwohl Error keine Unterklasse von RuntimeException ist!). Allerdings ist es möglich, die Fehler aufzufangen, da Error-Klassen Unterklassen von Throwable sind und sich daher genauso behandeln lassen. Insofern ist ein Auffangen legitim, und auch ein finally ist korrekt. Ob das Auffangen sinnvoll ist, ist eine andere Frage, denn wenn die JVM einen Fehler anzeigt, bleibt offen, wie darauf sinnvoll zu reagieren ist. Was sollten wir bei einem LinkageError tun? Einen OutOfMemoryError in bestimmten Programmteilen aufzufangen, kann jedoch von Vorteil sein. Eigene Unterklassen von Error sollten keine Anwendung finden. Glücklicherweise sind die Klassen aber nur Unterklassen von Throwable und nicht von Exception, sodass ein catch(Exception e) nicht aus Versehen Dinge wie ThreadDeath abfängt, die eigentlich nicht behandelt gehören.