2014-12-29 6 views
5

Ich bin mir nicht sicher, warum die uncaughtException-Methode nicht aufgerufen wird.UncaughtExceptionHandler fängt keine Ausnahme an

static 
{ 
    /** 
    * Register a logger for unhandled exceptions. 
    */ 
    Thread.UncaughtExceptionHandler globalExceptionHandler = new Thread.UncaughtExceptionHandler() 
    { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) 
     { 
      System.out.println("handle exception."); // can also set bp here that is not hit. 
     } 
    }; 

    Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); 
    Thread.currentThread().setUncaughtExceptionHandler(globalExceptionHandler); 

    /** 
    * Register gateway listen port. 
    */ 
    try 
    { 
     // some stuff that raises an IOException 
    } 
    catch (IOException e) 
    { 
     System.out.println("Throwing exception"); 
     throw new RuntimeException(e); 
    } 

} 

Das Programm Ausgabe lautet:

Werfen Ausnahme

java.lang.ExceptionInInitializerError 
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: blah.jks 
    (The system cannot find the file specified) 
...some stack trace... 
Exception in thread "main" 
Process finished with exit code 1 
+0

Statistik-Abschnitt ist speziell in JVM Threated als das erste Abschnitt für Klasse, so dass ich denke, es hängt wirklich von JDK-Implementierung. Zum Beispiel behandelt mein Oracle JDK 1.7.0_65 die Ausnahme korrekt. – terma

+0

Wahrscheinlich, weil die Ausnahme korrekt behandelt wird, d. H. Der Thread wird beendet. Ich würde diese Handhabung nicht verwenden, außer wenn Sie tatsächlich Threads außerhalb des Hauptthreads generieren. –

Antwort

5

Die RuntimeException wird von einem statischen Initialisierer ausgelöst, geschieht es, wenn Ihre Hauptklasse geladen ist. Es ist dann gefangen durch den System-Klassenlader, der es in eine ExceptionInInitializerError Wraps, dann endet von der JVM. Da die Ausnahme abgefangen wird, wird Ihr standardmäßiger nicht abgefangener Ausnahmebehandler nie aufgerufen.

0

Ihr Code ist ein IOException werfen und Ihre catch Fänge ein IOException. Die IOException wird abgefangen und behandelt. IIRC Die UncaughtExceptionHandler behandelt nur die nicht abgefangene Ausnahme innerhalb des normalen Codes, nicht innerhalb einer catch. Versuchen Sie, Ihre catch vorübergehend zu ändern, um eine andere Ausnahme abzufangen, und sehen Sie, was passiert. Vergessen Sie nicht, es später wieder zu ändern!

0

Ihr Code ist im statischen Block. Außer in sehr seltenen Fällen der JVM-Implementierung (falls vorhanden), sollten Sie bei statischen Blöcken nicht mit Fehlern oder Ausnahmen umgehen, wenn dies möglich ist. Dies liegt daran, dass Sie nicht so viel Kontrolle über die Ausführung statischer Blöcke haben (außer Sie haben einen dynamischen Klassenlader), was ziemlich selten ist.

Also, wenn es fair ist, bewegen Sie Ihren Code zu Instanz-Block und es sollte gut funktionieren.

Wenn also etwas unerwartetes in Ihrem statischen Block passiert, wird erwartet, dass Ihre Anwendung nicht fortfährt. Im Grunde genommen werden all diese unerwarteten Ausnahmen im statischen Block durch ExceptionInIntializerError dargestellt. Sie können sich beziehen auf here

Verwandte Themen