@NonNull
enum Foo {
A, B
}
public class Test {
public static void main(String[] args) throws Exception {
EnumMap map = new EnumMap(Foo.class);
map.get(null);
}
}
$ findbugs.bat -low -textui Test.class H C NP: Test.main(String[]) でnullをメソッドに渡していますが、この引数は java.util.EnumMap.get(Object) で@NonNull宣言されています。 Test.java:[line 10]行目 Warnings generated: 1
あれ? 何で標準ライブラリのEnumMap.get()にFindBugsの@NonNullアノテーションが付いてるの? と思ったら、FindBugs内部で、こんなことをしていた。
addMethodParameterAnnotation("java.util.EnumMap", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", false, 0, NullnessAnnotation.NONNULL);
しかしEnumMap.get()はAPI仕様書に、引数がnullの場合の挙動が書かれていないので、微妙だ。現在の実装はnullだったらnullが返るようだが、そもそもEnumにnullのメンバなんてあり得ないんだから、null引数ならNPEって仕様にしておけば良かった気がする。Map.get()にもNPE投げてokって書いてあるんだし。





