2

NPE を防ぐために、既存のプロジェクトでfindbugs@Nonnull@CheckForNull注釈を使用し始めましたが、非常にうまく機能すると思います。戻り値の型とパラメーターのデフォルトとして使用@Nonnullし、デフォルト値を追加するだけで、すでにいくつかの NPE を見つけました。今、私はこれに似た方法を見つけました:

@Nonnull
private Integer getInteger(String key) {
    return Map.get(key);
}

そして、それは警告を生成しません。その理由は理解できたのですが、どうすればこの問題を回避できますか? プロジェクトでこれをどのように回避しますか?

のようなものなど、グローバルに適用できるソリューションが優先されます@ApplyCheckForNullToAllExternalCalls

4

1 に答える 1

1

@CheckForNullパッケージのファイルに注釈を追加することで、パッケージ内のすべてのメソッドの戻り値 (および/またはパラメーター) に適用できますpackage-info.javaが、個々のメソッドを制御することはできません。

まず、@ReturnValuesAreCheckForNullByDefaultプロジェクトのユーティリティ パッケージに作成します。

@Documented
@CheckForNull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnValuesAreCheckForNullByDefault { /* noop */ }

次に、作成しますsrc/java/util/package-info.java

@ReturnValuesAreCheckForNullByDefault
package java.util;

import my.project.util.ReturnValuesAreCheckForNullByDefault;

最後に、FindBugs の警告をお楽しみください。

@Nonnull
public String getValue() {
    Map<String, String> values = new HashMap<>();
    return values.get("foo");    // <-- Possible null pointer dereference ...
}

これを行う際の問題は、契約上 を返さないjava.*パッケージに多くのメソッドがあることです。これらをチェックせずに使用すると、警告が発生します。たとえば、次の NPE セーフ コードでも警告が発生します。nullnull

@Nonnull
public Set<String> getNotNull() {
    Map<String, String> values = new HashMap<>();
    return values.keySet();
}

で警告を抑制することができますが@SuppressFBWarnings、これによりコードが乱雑になりすぎる可能性があります。

于 2013-01-08T00:20:40.993 に答える