Thread.UncaughtExceptionHandler
gibt an, dass, wenn die Methode, die nicht abgefangene Ausnahmen behandelt, selbst eine Ausnahme auslöst, diese Ausnahme ignoriert wird:
void uncaughtException (Thread t, Throwable e):
Methode, die aufgerufen wird, wenn der angegebene Thread aufgrund der angegebenen beendet wird Nicht abgefangene Ausnahme.
Jede von dieser Methode ausgelöste Ausnahme wird von Java ignoriert Virtuelle Maschine.
Beim Testen hat die JVM jedoch die vom nicht abgefangenen Ausnahmehandler behandelten Ausnahmen nicht ignoriert:
%Vor%Eclipse-Konsolenausgabe (JRE 1.7):
Ausnahme: java.lang.RuntimeException ausgelöst von der UncaughtExceptionHandler im Thread "main"
Eine weitere Kuriosität, die ich herausgefunden habe, ist, dass die Ausgabe, die ich bekomme, nicht von System.err
kommt. Es scheint von einem anderen Strom zusammen zu sein. Ich habe dies überprüft, indem ich System.err
auf System.out
umgeleitet habe, aber ich bekomme immer noch eine "rote" Ausgabe:
Die Ausgabe (Fettschrift bedeutet rote Farbe):
wahr
das ist schwarze Farbe
java.lang.Error: Testen Sie die Stacktrace-Farbe unter asf.df.main (df.java:13)
Ausnahme: java.lang.RuntimeException, ausgelöst vom UncaughtExceptionHandler im Thread "main"
Was ist die Erklärung für diese Phänomene?
Was passiert mit Fehlern, die in UncaughtExceptionHandler geworfen werden? Was ist das erwartete (dokumentierte oder garantierte) Verhalten?
HotSpot JVM gibt die vom UncaughtExceptionHandler ausgegebenen Ausnahmen aus. Siehe JavaThread :: exit
%Vor% JVM druckt diese Ausnahmen selbst direkt auf stderr
unabhängig vom Status System.err
- ob es umgeleitet wurde oder nicht.
Nun, diese Art der Warnung hat keinen Einfluss auf die Anwendung - in diesem Sinne wird die Ausnahme "ignoriert". Aber du hast Recht, dieses Verhalten ist nicht offensichtlich. Javadoc ist irreführend und sollte besser repariert werden.
Die Ausnahmen werden ignoriert und die Verarbeitung wird fortgesetzt, wenn sie von einem Nicht-Hauptthread ausgelöst wird.
Wenn es in main geworfen wird, ist der zurückgegebene Fehlercode nicht Null.
Die nicht behandelten Ausnahmen werden über syserr protokolliert.
%Vor%Ausgabe:
In Kind UncaughtExceptionHandler am 2014-07-19T04: 10: 46.184Z
Ausnahme: java.lang.RuntimeException ausgelöst vom UncaughtExceptionHandler im Thread "Thread-0" Nach Unterthread: 2014-07-19T04: 10: 48.197Z Im Haupt-UncaughtExceptionHandler 2014-07-19T04: 10: 48.197Z
Ausnahme: java.lang.RuntimeException ausgelöst vom UncaughtExceptionHandler im Thread "main"
Tags und Links java exception-handling jvm uncaught-exception uncaughtexceptionhandler