1

以下のコードをコンパイルすると、次のエラーが発生します。

/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にあります

4

1 に答える 1

4

チェック済み例外は、Java の約束よりもはるかに古く、Java 8 の時点ではうまく機能しません。技術的に言えば、BiFunctionはチェック済み例外のスローを宣言していません。そのため、findCommonMatchに渡すthenCombineもそれらをスローできません。

NoMatchExceptionから継承してチェックを外しRuntimeExceptionます。また、ルックアップ メソッドから誤解を招く宣言を削除しthrowsます — 何もスローしていません — promise 内にカプセル化されているコードは、promise を作成するメソッドではなく、スローしようとしています。

promise 内でスローされた例外は、コードから完全に見えないように設計されており、それらを作成してサブスクライブします。代わりに、通常、チェックされていない例外を使用し、特定の promise ライブラリに固有の方法でそれらを処理することが期待されます (例外処理機能の詳細については、 CompletionStageのドキュメントを参照してください)。

于 2016-02-26T04:39:39.210 に答える