— Привіт, Аміго!
Хочу розповісти тобі про маленьку, але цікаву річ.
— Я слухаю. Люблю цікаві та маленькі речі.
Так ось, ти знаєш, що кожен об'єкт Thread має метод run(). І що можна запустити його на виконання в окремій нитці за допомогою методу start().
— Так, звичайно.
— А ось уяви тепер ситуацію - ти запускаєш нитку, щоб вона виконала потрібну тобі роботу, а у неї всередині виникає Exception і вона завершує роботу, так і не виконавши того, що треба. Тобі треба якось дізнатися про цю помилку?
— Згоден. А що, якось можна перехопити виняток, який виник у іншій занедбаній нитці. Невже це навіть є в Java?
— Ображаєш. Ще як є.
Розробники Java придумали спеціальний інтерфейс UncaughtExceptionHandler. Ось як можна перехопити та обробити виняток в іншій нитці, якщо вона не перехопила його сама:
public class DownloadManager
{
public static void main(String[] args)
{
Thread thread = новий DownloadThread();
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
}
});
thread.start();
}
Об'єкт типу Thread має спеціальний метод – setUncaughtExceptionHandler. В нього потрібно передати об'єкт, який реалізує інтерфейс Thread.UncaughtExceptionHandler. Цей інтерфейс має лише один метод uncaughtException(Thread t, Throwable e). Саме цей метод буде викликаний у переданого об'єкта, якщо всередині методу run виникне виняток, який не буде захоплено.
У наведеному прикладі, я просто оголошую анонімний внутрішній клас (виділено червоним), що реалізує інтерфейс Thread.UncaughtExceptionHandler. І перевизначаю в ньому метод uncaughtException(Thread t, Throwable e).
Як видно з параметрів методу, в нього будуть передані два параметри – посилання на Thread, у якому виник виняток, і сам виняток – Throwable e.
— А навіщо потрібне посилання на Thread — змінна t? Ми ж знаємо, який потік встановлюємо об'єкт типу Thread.UncaughtExceptionHandler?
— А це зроблено для того, щоб ти міг написати універсальний обробник таких ситуацій – створити єдиний об'єкт і передавати його десяткам різних потоків. Тоді всередині методу uncaughtException(Thread t, Throwable e) у тебе завжди буде посилання на нитку, де виник виняток.
Крім того, ти можеш створювати нитки десятками, наприклад, у циклі для виконання яких-небудь завдань. Загалом це посилання на нитку зайвої не буде, це я тобі обіцяю.
— Я тобі вірю. Ти ще жодного разу не помилялася.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ