class Solution {
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<Integer> future = executorService.submit(() -> {
try{
System.out.println("Start");
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new InterruptedException();
}
Random random = new Random();
int randomValue = random.nextInt(10);
if(randomValue > 5){
throw new Exception(); // 19 line
}
return randomValue;
});
executorService.shutdown();
try{
int value = future.get();
System.out.println(value);
} catch (InterruptedException e){
System.out.println("Thread was interrupted");
} catch (ExecutionException e) {
Throwable ex = e.getCause();
System.out.println(ex.getMessage());
} catch (Exception e) {
System.out.println("g");
}
}
}
Kransbect
2 уровень
Люди, ПОЖАЛУЙСТА Я РЕАЛЬНО НЕ ПОНИМАЮ. Почему, когда в 19 строке я выбрасываю исключение Exception, а при перехвате исключения у меня выполняется блок catch с исключением ExecutionException, а само ExecutionException мне не дают выбросить(((((((((((((((((
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
16 августа 2024, 07:13решение
Опиши нормально что конкретно ты пытаешься сделать и кто тебе этого сделать не даёт.
Но подозреваю ты пытаешься сделать что-то типа throw new ExecutionException(); а так не выходит, и идея тебе наверное подсказывает что у этого конструктора protected доступ... вот тебе и скоуп работ, почитать что такое protected и почему в данном конкретном случае не получается им воспользоваться.
Кроме того у этого исключения есть два публичных конструктора ими ты пользоваться можешь:
+2
Kransbect
16 августа 2024, 09:25
Спасибо за ответ, я думал уже никто не ответит.
Хорошо, я понял почему не могу выбросить throw new ExecutionException(), но все таки почему, когда я выбрасываю Exception() у меня он перехватывается в блоке catch с ExecutionException(). Я вот этого не понимаю.
0
Денис Enterprise Java Developer
16 августа 2024, 10:14решение
Потому что ты выкидываешь исключение внутри FutureTask которым оперирует твой экзекутор. Там же оно оборачивается в ExecutionException и впоследствии пробрасывается выше в рамках метода get().
Почитай стектрейс. На объекте Exception вызови printStackTrace()
+2
Kransbect
17 августа 2024, 08:28
Я посмотрел StackTrace. Получается я вызываю метод get(), он вызывает метод report((), который выбрасывает CancellationException() если задача отменена и ExecutionException() если мы выбросили исключение.
А если нам надо посмотреть, что это за исключение, то мы можем либо в StackTrace посмотреть, либо в самом исключении передать информацию о нем.
Интересно, интересно...
Спасибо за помощь.
+1
Kransbect
15 августа 2024, 16:46
Сори, что проблему в названии написал
0