2014-12-29 9 views
5

Я не уверен, почему метод uncaughtException не вызывается.UncaughtExceptionHandler не исключение catch

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); 
    } 

} 

Выход программы:

Бросив исключение

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

Раздел Statis создан специально для JVM, так как это начальный раздел для класса, поэтому я думаю, что это действительно зависит от реализации JDK. Например, мой Oracle JDK 1.7.0_65 корректно обрабатывает исключение. – terma

+0

Возможно, потому что исключение обрабатывается правильно, то есть поток прекращается. Я бы не использовал эту обработку, если вы фактически не создаете потоки вне основного потока. –

ответ

5

RuntimeException Поднимается из статического инициализатора, это происходит, когда загружается ваш основной класс. Затем поймал загрузчиком системного класса, который завершает его в ExceptionInInitializerError, а затем выходит из JVM. Поскольку исключение поймано, ваш обработчик исключенных исключений по умолчанию никогда не вызывается.

0

Ваш код бросает IOException, и ваши catch ловит IOException. IOException пойман и обработан. IIRC UncaughtExceptionHandler занимается только неперехваченным исключением из обычного кода, а не с catch. Попытайтесь временно изменить свой catch, чтобы поймать какое-то другое исключение, и посмотрите, что произойдет. Не забудьте изменить его обратно!

0

Ваш код находится в статическом блоке. Если в очень редком случае реализации JVM (если таковой имеется), статический блок не там, где вам следует обращаться с любыми ошибками или исключениями, если это возможно. Это связано с тем, что вы не контролируете выполнение статического блока (если у вас нет динамического загрузчика классов), что довольно редко.

Итак, если это справедливо, переместите свой код в блок экземпляра, и он должен работать нормально.

Поэтому, когда что-то неожиданное происходит в вашем статическом блоке, ожидается, что ваше приложение не будет продолжено. Таким образом, все эти неожиданные исключения в статическом блоке будут представлены ExceptionInIntiializerError. Вы можете обратиться к here

Смежные вопросы