Код, принятый валидатором: import java.util.TimerTask; public class Solution extends TimerTask { protected TimerTask original; protected final Thread.UncaughtExceptionHandler handler; public Solution(TimerTask original) { if (original == null) { throw new NullPointerException(); } this.original = original; this.handler = new Thread.UncaughtExceptionHandler(){ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(e.getMessage().replaceAll(t.getName(), t.getName().replaceAll(".","*"))); } }; } public void run() { try { original.run(); } catch (Throwable cause) { Thread currentThread = Thread.currentThread(); handler.uncaughtException(currentThread, new Exception("Blah " + currentThread.getName() + " blah-blah-blah", cause)); } } public long scheduledExecutionTime() { return original.scheduledExecutionTime(); } public boolean cancel() { return original.cancel(); } public static void main(String[] args) { Solution solution = new Solution(new TimerTask() { @Override public void run() { throw new RuntimeException(); } }); solution.run(); } } В main создаём объект solution. Во время создания происходит две вещи: 1. В конструкторе создаём нить handler = new Thread.UncaughtExceptionHandler() , которая ничего не делает до поры до времени. 2. Переопределяем функцию run в анонимном классе для созданного объекта. Когда запускаем solution.run(); наш метод бросает исключение RuntimeException, а дальше уходит в метод run класса solution, где проскакивает try { original.run(); и уходит в catch (Throwable cause) Поясните, почему цепочка уходит в тот метод run класса solution?, а не сразу в метод uncaughtException ?