在可完成的未来

时间:2016-02-26 03:59:02

标签: java future completable-future

当我编译下面的代码时,我收到以下错误:

/home/prakashs/composite_indexes/src/main/java/com/spakai/composite/TwoKeyLookup.java:22: error: unreported exception NoMatchException; must be caught or declared to be thrown
        CompletableFuture<Set<V>> result = calling.thenCombine(called, (s1, s2) -> findCommonMatch(s1, s2));

代码:

 public CompletableFuture<Set<V>> lookup(K callingNumber, K calledNumber) throws NoMatchException {
        CompletableFuture<Set<V>> calling = callingNumberIndex.exactMatch(callingNumber);
        CompletableFuture<Set<V>> called = calledNumberIndex.exactMatch(calledNumber);
        CompletableFuture<Set<V>> result = calling.thenCombine(called, (s1, s2) -> findCommonMatch(s1, s2));
        return result;
    }

    public Set<V> findCommonMatch(Set<V> s1, Set<V> s2) throws NoMatchException {
        Set<V> intersection = new HashSet<V>(s1);
        intersection.retainAll(s2);

        if (intersection.isEmpty()) {
          throw new NoMatchException("No match found");
        }

        return intersection;
    }

我已经宣布它会被抛出。我错过了什么?

完整代码位于https://github.com/spakai/composite_indexes

1 个答案:

答案 0 :(得分:2)

Checked Exceptions比Java承诺要早得多,并且从Java 8开始不适用于它们。从技术上讲,BiFunction不会声明抛出任何已检查的Exception。因此,您传递给findCommonMatch的{​​{1}}也无法抛出它们。

通过继承thenCombine取消选中NoMatchException。同样从查找方法中删除误导性的RuntimeException声明 - 它不会抛出任何东西 - 包含在promise中的代码将抛出,而不是创建承诺的方法。

在promises中抛出的异常是设计完全不可见的代码,它创建它们并订阅它们。相反,您通常需要使用未经检查的异常并以特定于特定承诺库的方式处理它们(有关其异常处理工具的详细信息,请参阅CompletionStage的文档)。