我在第二种方法Unhandled exception works differently on two different methods
上得到了getByIds
这没有任何意义。
我在第二种方法中调用了第一种方法,并已经将try catch放入了。
对这个例外有任何想法吗?谢谢
@Override
public PostPayload getById(@NotNull UUID issueId) throws APIException {
try (...) {
return test.apply(responseIssue, issueAuxiliaryData);
} catch (IOException e) {
logger.error("Event='Unable to retrieve XXX ', issueId={}", issueId, e);
throw new APIException("Unable to retrieve XXX for issueId=" + issueId, e);
}
}
@Override
public List<PostPayload> getByIds(@NotNull Set<UUID> issueIds) throws APIException {
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 APIException("Unable to retrieve XXX for issueId=" + issueId, e);
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
答案 0 :(得分:3)
您可以做两件事,但有一个例外:
throw
您的第一种方法的签名中带有throws APIException
,因此抛出APIException
是正确的事情。
但这与您的其他方法有何不同?在这里,您尝试从传递给stream().map()
方法的lambada中引发异常。从文档中,我们可以找到与此lambda对应的功能接口:
public interface Function<T, R> {
R apply(T t);
}
从签名中我们可以看到它没有引发任何检查过的异常,因此从lambda中抛出APIException
是一个编译错误(假设APIException
是检查过的异常)
一个可能的解决方法是定义另一个异常版本,该异常版本源自RuntimeException
,例如UncheckedApiException
。然后,您可以将整个流操作包装在catch块中的一个大try-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);
}
}