35

( Google Guavaの)com.google.common.base.Functionインターフェースは次のように定義されます。apply

@Nullable T apply(@Nullable F input);

このメソッドには、次のjavadocノートがあります。

@throws NullPointerException if {@code input} is null and this function does not accept null arguments

FindBugsは私のFunctionの実装について不平を言っています:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

優先度の高い警告付き:

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE、優先度:高

入力はnull以外である必要がありますが、null可能としてマークされています

このパラメーターは常にnull以外である必要がある方法で使用されますが、パラメーターはNullableとして明示的に注釈が付けられます。パラメータまたは注釈の使用が間違っています。

私の関数は入力をサポートしておらずnull、その場合は例外がスローされます。私が正しく理解していれば、FindBugsはこれをnull以外の要件として扱います。

私には矛盾のように見えます。入力は@Nullableですが、メソッド@throwsNullPointerExceptionがnullの場合です。私は何かが足りないのですか?

私が見ることができる警告を取り除く唯一の方法は手動抑制です。(明らかに、Guavaコードは私の制御不能です)。

@Nullableアノテーション、FindBugs、Guava、または私自身の使用法について誰が間違っていますか?

4

3 に答える 3

28

あなたの実装は間違っています;)

基本的にドキュメントは言います(言い換えて強調します):

@throws NullPointerExceptioninputnullであり、具象関数の実装がnull引数を受け入れない場合

関数を実装することにより、nullを受け入れるかどうかを決定する必要があります。最初のケース:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        return input == null ? null : input.field;
    }
}

2番目の場合:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

どちらの例でも、nullを返すことが許可されています。

編集:

Guavaは@javax.annotation.ParametersAreNonnullByDefaultすべてのパッケージで使用するため、@Nullable存在する場合は「グローバル@Nonnullを一時停止し、ここでnullを許可する」ことを意味し、存在しない場合は「ここでnullを禁止する」ことを意味します。

@Nonnullとはいえ、引数またはパッケージでアノテーションを使用し@ParametersAreNonnullByDefaultて、FindBugs関数の引数をnullにできないことを通知することもできます。

編集2:

このケースは既知の問題であることが判明しました。コメント#3を参照してください(Guavaのリード開発者であるKevin Bourrillionから、FindbugsのリードであるBill Pughとの会話について):

私の参照は、ビル・ピューとの一連の対面の会話でした。@Nullable彼は、いくつかのサブタイプ がnullを受け入れる可能性があることだけを意味することを明確に主張しました。そして、これは私たちにとってfindbugsによって裏付けられているようです-私たちのコードはnullabilityチェックにかなりきれいに合格します(ただし、この特定の関数の変更が行われたので、もう一度チェックする必要があります)。

于 2012-09-14T10:36:20.280 に答える
4

パラメータをマーク@Nonnullすると、findbugsの問題が解決します。

于 2015-02-04T10:45:13.393 に答える
0

デフォルトでは、Google Guava関数はデフォルトで@Nullableであるように見えます-アノテーションがない場合、「結果はnull以外である必要がありますが、null可能としてマークされています」というFindbugsエラーが発生していました。次の方法で関数宣言に@Nonnullを追加すると、次のようになりました。

new Function<Object, Object>() {
            @Nonnull
            public Object apply(@Nonnull Object object) {

そして今、Findbugsは幸せです。皆さんありがとう

于 2017-07-28T09:39:54.843 に答える