2012-09-14 8 views
33

com.google.common.base.Functionインタフェース警告applyとして定義トリガー。@Nullable入力はFindBugsのは(<a href="http://code.google.com/p/guava-libraries/wiki/Release13">Google Guava</a>から)

のFindBugsは、機能の私の実装について不平を言う:

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE、優先順位:、優先度の高い警告で

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; 
    } 
} 

ハイ

入力がNULLでなければなりませんが、マークされていますnullableとして

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

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

私には矛盾のように見えます。入力は@Nullableですが、nullの場合、メソッド@はNullPointerExceptionをスローします。何か不足していますか?

私が見ることができる警告を取り除く唯一の方法は、手動抑制です。 (グアバコードは明らかに私のコントロール外です)。

@Nullableアノテーション、FindBugs、Guava、または自分の使い方は間違っていますか?

+4

あなたは、署名でnullを受け入れて、本体にnull値を*拒否していると言っています。 '@ Nullable'の目的を誤解しているようです。 –

+4

'@ Nullable'を入力パラメータに追加した唯一の理由は、' Function'インタフェースが定義するものであるということだけです。 とにかく、@ Xaerxessが示唆しているようにパラメータから '@ Nullable'アノテーションを削除しましたが、FindBugsは不満を持ち続けます。 – vitaly

答えて

28

あなたの実装が間違っている;)

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

@throws NullPointerExceptioninputがnullで、具体的な 関数の実装がnullの引数を受け入れない場合

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

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

:最初のケースではヌルを戻す両方の例において

​​

が許可されています。

EDIT:

注グアバは@Nullableが存在する場合、それは「グローバル@Nonnullを中断し、ここでNULLを許可する」を意味していない場合、それは「ヌルがここに禁止さ」を意味し、したがって、すべてのパッケージに@javax.annotation.ParametersAreNonnullByDefaultを使用していること。

あなたの引数に@Nonnull注釈を使用するか、パッケージ内の@ParametersAreNonnullByDefaultを使用して、FindBugs関数の引数をnullにすることはできません。 EDIT 2

コメント#3参照、this case is known issueが判明(グアバのリードdevのケビンBourrillionからの、ビル・ピュー、FindBugsの鉛との彼の会話について):

私の参照がしましたBill Pughとの一連の面談。 彼は、@Nullableはいくつかのサブタイプだけを意味すると明白に主張した。 はnullを受け入れる。そして、これは私たちのためにfindbugsによって出されたようです - 私たちのコードはnullabilityabilityチェックをきれいに渡します(ただし、この特定の関数の変更が行われたので を再度チェックしてください)。

+0

インプリメンテーションでインターフェイスで指定されたアノテーションを削除しても問題ないのですか? – vitaly

+1

インタフェースからそれらを削除しないで、実装にtoを追加します。 'Function'が引数としてnullを使うことを許しても、' Function'契約のように、あなたのimplでnullを許さなければならないわけではありません。 – Xaerxess

+4

注釈はフレームワークインタフェースによって既に指定されており、そこからifを削除することはできません。 編集できるコードは自分のコード(=実装)だけです。 実装から@Nullableアノテーションを削除しましたが、FindBugsは不平を続けています。 – vitaly

3

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

0

デフォルトではGoogle Guava関数はデフォルトで@Nullableであるようですが、注釈がないときは「結果は非nullである必要がありますがnullableとしてマークされています」というエラーが表示されていました。

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

、今FindBugsのは幸せです:次のように関数宣言に@Nonnullを追加すると、助けました。ありがとうございました

関連する問題