У меня есть следующий код, который я ожидаю выполнять успешно к завершению, но сбои кода в строке "сбой ("это не должно быть достигнуто")";. может кто-то объяснять, почему обработчика необработанных исключений по умолчанию не называют:
public class UncaughtExceptionTest extends TestCase
implements UncaughtExceptionHandler {
private final List<Throwable> uncaughtExceptions =
new CopyOnWriteArrayList<Throwable>();
class UncaughtExceptionTestInnerClass implements Runnable {
private final ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(1);
private final CountDownLatch latch;
UncaughtExceptionTestInnerClass(CountDownLatch latch) {
this.latch = latch;
executor.schedule(this, 50, TimeUnit.MILLISECONDS);
}
@Override
public void run() {
System.out.println("This is printed");
fail("this should fail");
latch.countDown();
}
}
@Test
public void testUncaughtExceptions() {
Thread.setDefaultUncaughtExceptionHandler(this);
CountDownLatch latch = new CountDownLatch(1);
UncaughtExceptionTestInnerClass testTheInnerClass =
new UncaughtExceptionTestInnerClass(latch);
try {
if (!latch.await(1, TimeUnit.SECONDS)) {
if (uncaughtExceptions.size() > 0) {
Throwable exception = uncaughtExceptions.get(0);
System.out.println("First uncaught exception: " +
exception.getMessage());
}
else {
fail("this should not be reached");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void uncaughtException(Thread t, Throwable e) {
uncaughtExceptions.add(e);
}
}
Это связано с тем, что вы используете Executor для выполнения задачи. Обработчик неперехваченных исключений вызывается только в том случае, если поток собирается завершить работу из-за неперехваченного исключения. Если вы измените свою реализацию на использование простого потока, чтобы поток завершился с исключением, вы увидите ожидаемое поведение.
В зависимости от того, как вы отправляете задачи, поток-исполнитель может перехватить все Throwables и обработать их. Следовательно, поток не завершается из-за этих исключений, и, таким образом, обработчик неперехваченных исключений не участвует. Например, ThreadPoolExecutor.execute (Runnable) вызовет обработчик неперехваченных исключений. Однако ThreadPoolExecutor.submit (Callable) этого не делает. Кроме того, ScheduledThreadPoolExecutor.schedule () тоже не работает (это связано с использованием FutureTask для реализации).
Лучший способ доступа к неожиданным исключениям с помощью службы-исполнителя - через Future .