未处理的异常在两种不同方法上的工作方式不同

时间:2019-06-09 19:09:13

标签: java java-8

我在第二种方法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());
}

1 个答案:

答案 0 :(得分:3)

您可以做两件事,但有一个例外:

  1. 以某种方式处理它
  2. 重新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);
        }
    }