Java 9から追加されたList.of()
は、簡潔に不変リスト(immutable list)を作成できる便利なAPIです。しかし、使い方を間違えるとNullPointerException
を引き起こす落とし穴があります。
本記事では、List.of()
にnull
を渡した場合の挙動と、安全にリストを構築する方法について解説します。
List.of()にnullを渡すとどうなるか
以下のようにnull
を含む値をList.of()
に渡すと、実行時に例外が発生します。
String a = "hello";
String b = null;
List<String> list = List.of(a, b); // ← ここで例外が発生
実行結果:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.ImmutableCollections.listFromTrustedArray(...)
List.of()
は「null
非許容」です。これは公式ドキュメントにも明記されています。

List (Java SE 9 & JDK 9 )から引用
安全な方法1:Stream.of() + filter(Object::nonNull)
null
を除外してリストを構築したい場合は、Stream APIを使って次のように書けます:
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
String a = "hello";
String b = null;
List<String> list = Stream.of(a, b)
.filter(Objects::nonNull)
.collect(Collectors.toList()); // → ["hello"]
この方法ではnull
を安全に取り除いたリストを作成できます。List.of()
と異なり変更可能なリストになりますが、多くの場合は問題ありません。
安全な方法2:手動でnullチェックして追加
もっと素朴な方法として、以下のようにif
文で追加するのも実用的です:
import java.util.ArrayList;
import java.util.List;
String a = "hello";
String b = null;
List<String> list = new ArrayList<>();
if (a != null) list.add(a);
if (b != null) list.add(b); // → ["hello"]
処理の過程でnull
を記録・無視・ログ出力したい場合など、柔軟性があります。
nullを含める必要がある場合は?
どうしてもnull
を含む必要がある場合は、List.of()
を使うのではなく、通常のArrayList
やArrays.asList()
を使いましょう。
List<String> list = Arrays.asList("hello", null); // OK
ただし、Arrays.asList()
は固定サイズリストを返すため、要素の追加・削除はできない点に注意してください。
✅ まとめ
方法 | null許容 | リスト型 | 備考 |
---|---|---|---|
List.of(a, b) | ❌ | 不変リスト | nullを含むと例外 |
Stream.of(a, b).filter(…).collect() | ✅ | 可変リスト | nullを除外して簡潔に書ける |
手動で if != null で追加 | ✅ | 可変リスト | 柔軟な制御が可能 |
Arrays.asList(…) | ✅ | 固定サイズ | 要素の追加削除不可 |
Javaでnull
を扱う場面はまだ多くあります。List.of()
は便利ですが、「null
は許容されない」という仕様を正しく理解した上で使い分けることが大切です。