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