"Cześć Amigo!

„Chcę ci opowiedzieć o czymś małym, ale interesującym”.

„Słucham. Uwielbiam rzeczy, które są małe i interesujące”.

„Cóż, wiesz, że każdy obiekt Thread ma metodę run(). I że możesz ją wykonać w osobnym wątku, używając metody start()”.

"Oczywiście, że tak."

„Ale teraz wyobraź sobie taką sytuację: uruchamiasz wątek, aby wykonać jakąś pracę, ale zgłaszany jest wyjątek i wątek przestaje działać, ponieważ nie wie, co robić. Czy nie musiałbyś jakoś wiedzieć o tym błędzie?”

„Zgadzam się. Musiałbym jakoś przechwycić wyjątek, który wystąpił w innym uruchomionym wątku. Czy Java to w ogóle obsługuje?”

- Obrażasz mnie. Oczywiście, że tak.

„Twórcy Javy wymyślili specjalny interfejs o nazwie UncaughtExceptionHandler. Oto jak przechwycić i obsłużyć wyjątek występujący w innym wątku, jeśli ten wątek go nie przechwyci:”

Przykład
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

„Obiekt Thread ma specjalną metodę setUncaughtExceptionHandler . Musisz przekazać mu obiekt implementujący interfejs Thread.UncaughtExceptionHandler . Ten interfejs ma tylko jedną metodę: uncaughtException(Thread t, Throwable e) . Jest to metoda, która zostanie wywołana przekazany obiekt, jeśli w metodzie run wystąpi nieprzechwycony wyjątek."

„W powyższym przykładzie po prostu deklaruję anonimową klasę wewnętrzną (podświetloną na czerwono), która implementuje interfejs Thread. Thread.UncaughtExceptionHandler . I zastępuję jej metodę uncaughtException(Thread t, Throwable e) ”.

„Jak widać z listy parametrów metody, zostaną przekazane dwa argumenty: odwołanie do obiektu Thread, w którym wystąpił wyjątek, oraz sam wyjątek, przekazany jako Throwable e.”

„Cóż, po co mi zmienna Thread t? Czy nie wiemy już, w którym wątku umieszczamy obiekt Thread.UncaughtExceptionHandler ?”

„Zrobili to po to, abyś mógł napisać uniwersalną procedurę obsługi takich sytuacji, tj. możesz stworzyć pojedynczy obiekt i przekazać go do dziesiątek różnych wątków. Wtedy metoda uncaughtException (Thread t, Throwable e) zawsze daje odniesienie do Obiekt wątku, w którym wystąpił wyjątek."

„Co więcej, można tworzyć dziesiątki wątków, np. w pętli, do wykonywania określonych zadań. Ogólnie rzecz biorąc, to odwołanie się do obiektu Thread nie będzie zbyteczne. Obiecuję”.

- Wierzę ci. Nigdy się nie myliłeś.