@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 セーフ コードでも警告が発生します。null
null
@Nonnull
public Set<String> getNotNull() {
Map<String, String> values = new HashMap<>();
return values.keySet();
}
で警告を抑制することができますが@SuppressFBWarnings
、これによりコードが乱雑になりすぎる可能性があります。