Вы можете сделать две вещи за исключением:
- Как-то справиться
- Re-
throw
it
Ваш первый метод имеет throws APIException
в своей подписи, поэтому допустимым является использование APIException
.
Но чем это отличается от вашего другого метода? Там вы пытаетесь выбросить исключение из лямбады, переданной методу stream().map()
Из документации мы можем узнать функциональный интерфейс, соответствующий этой лямбде:
public interface Function<T, R> {
R apply(T t);
}
Из подписи видно, что он не генерирует никаких проверенных исключений, поэтому это ошибка компиляции, которая выдает APIException
изнутри лямбды (при условии, что APIException
является проверенным исключением)
Возможный обходной путь - определить другую версию вашего исключения, которая получается из RuntimeException
, например UncheckedApiException
. Затем вы можете обернуть всю потоковую операцию в один большой блок try-catch, а в блок catch вы можете выбросить проверенную версию:
@Override
public List<PostPayload> getByIds(@NotNull Set<UUID> issueIds) throws APIException {
try {
return issueIds.parallelStream()
.map(issueId -> {
try {
return this.getById(issueId, channelId, false);
} catch (IOException | APIException e) {
logger.error("Event='Unable to retrieve XXX ', issueId={}", issueId, e);
throw new UncheckedApiException("Unable to retrieve XXX for issueId=" + issueId, e);
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
} catch (UncheckedApiException e) {
throw new APIException(e);
}
}