Неперехватываемые исключения Multithreading

Рейтинг: -1Ответов: 1Опубликовано: 15.12.2014

Считается, что в Multithreading методе run() блока catch() для обработки исключений не существует. Для этого надо пользоваться Thread.UncaughtExceptionHandler interface.

public class Tester extends Thread{

    @Override
    public void run(){
        try {
            File file = new File(""); 
            file.getCanonicalFile();
        } catch (IOException ex) {           //контроллируемое
            Logger.getLogger(Tester.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NullPointerException e){    //неконтроллируемое

        }
    }

}

Растолкуйте, ибо я, скорее всего, неправильно понимаю данную формулировку.

Ответы

▲ 4Принят

Да, действительно не все исключения попадают в try/catch.
Класс Thread имеет статический метод setDefaultUncaughtExceptionHandler, который, как понятно из названия, задает обработчик, который на вход принимает объект класса Thread.UncaughtExceptionHandler.

   public class CustomUncaughtHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread thread, Throwable throwable) {
            System.out.println("Unhandled exception"+throwable + "has been received from thread"+ thread);
        }
    }

Соответственно, установить можно следующим образом:

Thread.setDefaultUncaughtExceptionHandler(new CustomUncaughtHandler());

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

Если я вообще правильно понял Ваш вопрос. Если что-то непонятно, то задавайте вопрос, желательно поконкретнее.