Подсмотрел на http://java-course.ru/articles/exceptions/ описание задачи и решил заменить . Блок исходный public TestedThread(Thread.UncaughtExceptionHandler handler) { setUncaughtExceptionHandler(handler); start(); } Блок с моими изменениями public TestedThread(Thread.UncaughtExceptionHandler handler) { super(); Thread.setDefaultUncaughtExceptionHandler(handler); start(); } Далее после решения начал рыскать и искать правильно ли это решение, в комментариях, нашел комментарий где описано,что использовать setDefaultUncaughtExceptionHandler(handler) в конструкторе не верно и понял, что было его правильно применить в main до старта threadA и threadB. Так же ещё раз посмотрел пример задачи ,которую прикреплял в начале. После этого понял,что они используют Thread.setDefaultUncaughtExceptionHandler() тоже в main. Посмотрел в комментариях,что код будет работать с setDefaultUncaughtExceptionHandler(handler) если добавить в конструктор,но компилятор не пропустит такое решение. После всего этого созрел вопрос,какая разница между этими двумя блоками. Если в конструкторе указать public TestedThread(Thread.UncaughtExceptionHandler handler) { setDefaultUncaughtExceptionHandler(handler); start(); } Или public TestedThread(Thread.UncaughtExceptionHandler handler) { super(); Thread.setDefaultUncaughtExceptionHandler(handler); start(); } Как понимаю валидатор пропустил из за вызова Thread. Также я добавил вызов super() но думаю и без него бы работало бы. Как я понимаю в первом случае метод вызовется для какой-то конкретной нити. А с добавлением Thread. метод вызовется для всех создаваемых нитей.