Предположим, что поток A запускает поток B. Затем поток B создает исключение.Вы можете подумать, что было бы неплохо, чтобы нить A поймала его.Но где?К тому времени, когда поток B выдает исключение, кто знает, что делает поток A?В качестве тривиального примера предположим, что у нас есть этот код в потоке A:
try
{
threadB=new PurgeAbandonedCarts();
threadB.start();
}
catch (NullPointerException panic)
{
... handle errors purging abandoned carts ...
}
try
{
processNewOrders();
}
catch (NullPointerException panic)
{
... handle problems in new orders ...
}
finally
{
... clean up ...
}
Итак, мы запускаем поток B, чтобы очистить оставленные корзины.Как только он начинает работать, мы переходим к обработке новых заказов.Затем поток B генерирует исключение нулевого указателя.Должен ли он быть перехвачен блоком перехвата, связанным с потоком B, или блоком, связанным с обработкой новых заказов?
Если он переходит к перехвату новых заказов, вполне вероятно, что любой код здесь не имеет ничего общего с очисткойпроблемы с потоком B. Это не может быть правильным ответом.
Если вы скажете тот, который связан с потоком B, то это означает, что во время обработки новых заказов контроль может внезапно быть выдернут и отправлен обратнопопробовать поток B ловить блок.Но что случилось с обработкой новых заказов?Мы просто останавливаемся в середине?Разве мы даже не попали в окончательный блок?И когда мы закончим, будем ли мы просто продолжать выполнять и снова приступать к обработке новых заказов?Мы обрабатываем заказы дважды?Это также не может быть правильным ответом.
Таким образом, некуда идти, если run выдает исключение.Единственное, что нужно сделать, - это чтобы метод run перехватывал любые исключения и обрабатывал их в новом потоке.