Почему ошибки Java проглатываются в потоках, порожденных экземпляром ExecutorService? - PullRequest
0 голосов
/ 24 октября 2018

Я думал, что ошибки Java указывают на серьезные проблемы и не должны обрабатываться.Почему тогда этот код работает нормально?

public static void main(String[] args)
{
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<?> future = executor.submit(() -> {throw new AssertionError();});
    while (!future.isDone()) {
    }
    System.out.println("done");
}

У меня был нереализованный метод, который выдавал ошибку AssertionError, чтобы напомнить мне о ее реализации, но он был просто поглощен без каких-либо признаков того, что что-то серьезно не так.

1 Ответ

0 голосов
/ 24 октября 2018

Он не проглочен, он есть:

public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<?> future = executor.submit(() -> {
            throw new AssertionError();
        });
        while (!future.isDone()) {
        }
        try {
            future.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("done");
    }

Вы получаете ошибку при вызове get метода, который дает вам результат вычисления в случае успеха или ошибку в противном случае.

java.util.concurrent.ExecutionException: java.lang.AssertionError в java.util.concurrent.FutureTask.report (FutureTask.java:122) в java.util.concurrent.FutureTask.get (FutureTask.j (FutureTask.j: 192) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...