9

このコードでFindBugsを実行すると、問題は報告されません。

boolean _closed = false;

public void m1(@Nullable String text) {
    if(_closed)
        return;

    System.out.println(text.toLowerCase());
}

ここにいる間、それは予想通り問題を見つけます:

public void m1(@Nullable String text) {
    System.out.println(text.toLowerCase());  // FindBugs: text must be nonnull but is marked as nullable
}

なぜ最初のケースで失敗するのですか?

4

6 に答える 6

1

私はFindBugsのソースを取り、検索しました

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

2つのファイルが見つかりました:

  1. BuildUnconditionalParamDerefDatabase.java
  2. InconsistentAnnotations.java

どちらも「無条件のパラメータの間接参照」のみを考慮します。

FindBugsはnullポインタの問題を見つけるのにそれほど有用ではないようです:-(

PS

public void m1(@CheckForNull String text) {
    if(_closed) // FindBugs: text must be nonnull but is marked as nullable
        System.out.println(text.toUpperCase());
    else
        System.out.println(text.toLowerCase());
}
于 2010-05-08T14:19:52.147 に答える
1

alex2k8に同意します。おそらく_closedデータメンバーが原因です。最終として宣言されていない限り、その初期化は関係ありません。静的分析には、実行時に_closedの実際の値を決定するための一般的な手段がなく、ソフトウェアがそれを実行することはできません(停止問題と同等です)。

于 2010-05-07T23:00:22.220 に答える
0

@Nullableは、nullにすることを許可するパラメーター、メソッド、またはフィールドでのみ可能です。

テキスト変数にnull値を許可しているようです。代わりに@NonNullを使用する必要があります。

編集

私はこれを自分で試してみましたが、同じ結果が得られました。

findbugsエラー(nullpointerバグを与える2番目のメソッドから)レポートのテキストは次のように述べています:

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

私の推測では、これは最終的なパラメーターではないため、後で変更できるため、FindBugsは_closedの値について何も想定できない/想定しないでしょう。_closed variabelメソッドをm1-method内でスコープ化しようとしましたが、それでもバグとして報告されません。

于 2010-05-07T21:36:07.087 に答える
0

edu.umd.cs.findbugs.annotations.Nullable [ターゲット]フィールド、メソッド、パラメーター

状況によっては、注釈付き要素がnullになる可能性があります。一般に、これは、開発者がドキュメントを読んで、null値がいつ受け入れられるか、およびnull値をチェックする必要があるかどうかを判断する必要があることを意味します。FindBugsは、注釈が付けられたアイテムを注釈がないかのように扱います。

実際には、このアノテーションは、包括的なNonNullアノテーションをオーバーライドする場合にのみ役立ちます。

http://findbugs.sourceforge.net/manual/annotations.html

于 2010-05-10T19:04:14.023 に答える
0

@Nullable の代わりに @CheckForNull を使用したい

于 2010-05-07T22:03:40.493 に答える
-1

JavaLintを実行します-私はそれがあなたにそれを教えてくれると思います

System.out.println(text.toLowerCase());

最初の例では到達不能です。到達できないので、FindBugはNullPointerExceptionを引き起こす可能性があることを気にしないと思います

于 2010-05-07T21:43:19.047 に答える