List#contains(null)は使わないほうが良い
List(などのコレクション)が要素に null を含むかどうかの判定に、 contains(null) を利用すると NullPointerException が発生することがあります。
リファレンスには次のようにあります:
NullPointerException- 指定された要素がnullで、このリストがnull要素を許可しない場合(オプション)
オプション、とあるが、そういう型は実際に存在するのか、というと、Java9から導入された List.of() メソッドで生成される インスタンス(変更不能なリスト)がそれです。
簡単に試せます:
List<String> list = List.of("hello");
list.contains(null);
代わりに、例えば次のようなコードで実現できます:
list.stream().anyMatch(Objects::isNull);
ただし、lambdaを使うとオーバヘッドがあるため、Spring Framework内部では利用しない方針のようで、Springプロジェクトでは CollectionUtils.contains() というユーティリティメソッドが用意されていました。これを使うと次のようになります:
CollectionUtils.contains(list.iterator(), null);
関連リンク:
-
ProviderManager#checkState() throws NullPointerException #8689 - Spring Security issues