Thread.UncaughtExceptionHandler
besagt, dass, wenn die Methode, die nicht abgefangene Ausnahmen behandelt selbst eine Ausnahme auslöst, wird diese Ausnahme ignoriert:Werden Fehler, die in UncaughtExceptionHandler geworfen werden, verschluckt?
void uncaughtException(Thread t, Throwable e):
Method invoked when the given thread terminates due to the given uncaught exception.
Any exception thrown by this method will be ignored by the Java Virtual Machine.
Jedoch, wenn ich es getestet habe die JVM die Ausnahmen nicht ignorieren die abgefangene Ausnahme handler` behandelt
public static void main(final String args[]) {
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
throw new java.lang.RuntimeException("e2");
}
});
throw new RuntimeException("e1");
}
Eclipse-Console-Ausgang (JRE 1.7):
Exception: java.lang.RuntimeException thrown from the UncaughtExceptionHandler in thread "main"
Ein weiterer o ddity Ich fand heraus, dass die Ausgabe, die ich bekomme, nicht von System.err
kommt. Es scheint von einem anderen Strom zusammen zu sein. Ich überprüfte dies durch System.err
zu System.out
Umleitung, aber ich bin immer noch „rot“ Ausgabe bekommen:
public static void main(final String[] args) {
System.setErr(System.out);
System.out.println(System.err == System.out);
System.err.println("this is black color");
try {
throw new Error("test stacktrace color");
} catch (Throwable e) {
e.printStackTrace();
}
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
throw new RuntimeException("from handler");
}
});
throw new RuntimeException("from main");
}
Der Ausgang (bolded rot bedeutet Farbe):
true
this is black color
java.lang.Error: test stacktrace color at asf.df.main(df.java:13)
Exception: java.lang.RuntimeException thrown from the UncaughtExceptionHandler in 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?
Möglicherweise versionsspezifisch? –
Bereits in früheren Java-Versionen wurde von den Dokumenten angegeben, dass sie von der JVM ignoriert werden sollten. – Pacerier
In Oracle "1.6.0_39"/Ubuntu 12.04 wird die Ausnahme, die innerhalb des nicht abgefangenen Ausnahmebehandlers ausgelöst wird, von der JVM geschluckt. Wie @Andrew_CS sagte, könnte es versions-/herstellerspezifisch sein. – srkavin