Javaのforループでnullを防ぐ最良の方法は何ですか?
これはいようです:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
または
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
他の方法はないかもしれません。彼らはそれをfor
構文自体に入れるべきでした、それがnullならループを実行しないでください?
そのリストの取得元を確認する必要があります。
空のリストは失敗しないため、空のリストで十分です。
他のどこかからこのリストを取得し、それが大丈夫かどうかわからない場合は、ユーティリティメソッドを作成して次のように使用できます。
for( Object o : safe( list ) ) {
// do whatever
}
そしてもちろんsafe
は次のようになります:
public static List safe( List other ) {
return other == null ? Collections.EMPTY_LIST : other;
}
Nullを渡すと空のシーケンスを返すヘルパーメソッドを潜在的に作成できます。
public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
return iterable == null ? Collections.<T>emptyList() : iterable;
}
次に使用します:
for (Object object : emptyIfNull(someList)) {
}
私は実際にそうするつもりはありませんが、通常は2番目のフォームを使用します。特に、「or throw ex」は重要です。実際にnullにすべきではない場合は、必ず例外をスローする必要があります。 somethingが間違っていることは知っていますが、損傷の程度はわかりません。早めに中止します。
すでに2017年であり、 Apache Commons Collections4 を使用できるようになりました
使用法:
for(Object obj : ListUtils.emptyIfNull(list1)){
// Do your stuff
}
CollectionUtils.emptyIfNull
を使用して、他のCollectionクラスに対して同じnullセーフチェックを実行できます。
実装するメソッド呼び出しからList
を取得する場合は、null
を返さないで、空のList
を返します。
実装を変更できない場合は、null
チェックを使用する必要があります。 null
であってはならない場合、例外をスローします。
空のリストを返すヘルパーメソッドは使用しない場合がありますが、それは時々役立つことがありますが、バグを隠す可能性のあるすべてのループでそれを呼び出すことに慣れるでしょう。
配列にはArrayUtils.nullToEmpty
ライブラリのcommons-lang
を使用します
for( Object o : ArrayUtils.nullToEmpty(list) ) {
// do whatever
}
この機能は、ほとんどのJavaプロジェクトに含まれるcommons-lang
ライブラリに存在します。
// ArrayUtils.nullToEmpty source code
public static Object[] nullToEmpty(final Object[] array) {
if (isEmpty(array)) {
return EMPTY_OBJECT_ARRAY;
}
return array;
}
// ArrayUtils.isEmpty source code
public static boolean isEmpty(final Object[] array) {
return array == null || array.length == 0;
}
これは@OscarRyzの答えと同じですが、 DRY マントラのために、注目に値する価値があると思います。 commons-lang プロジェクトページを参照してください。これがnullToEmpty
APIです ドキュメント および ソース
プロジェクトにcommons-lang
を含めるMavenエントリ(まだない場合)。
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
残念ながら、commons-lang
はList
型に対してこの機能を提供しません。この場合、前述のヘルパーメソッドを使用する必要があります。
public static <E> List<E> nullToEmpty(List<E> list)
{
if(list == null || list.isEmpty())
{
return Collections.emptyList();
}
return list;
}
Java 8 Optional
の場合:
for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
// do whatever
}
上記の答えを修正したので、Objectからキャストする必要はありません。
public static <T> List<T> safeClient( List<T> other ) {
return other == null ? Collections.EMPTY_LIST : other;
}
そして、単にリストを呼び出す
for (MyOwnObject ownObject : safeClient(someList)) {
// do whatever
}
説明:MyOwnObject:List<Integer>
の場合、この場合MyOwnObjectは整数になります。
独自の静的ヌル安全メソッドを書くことに興味のない人には、commons-langのorg.Apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
を使用できます。例えば:
for (final String item :
(List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }
Forループでnullを効果的に防ぐもう1つの方法は、Google Guavaの Optional<T>
でコレクションをラップすることです。これは、クライアントがOptional.isPresent()
でコレクションが存在するかどうかを確認します。
指定されたコレクションが空かどうかをNullセーフチェックするCollectionUtils.isEmpty(Collection coll)
メソッドを使用します。
このimport org.Apache.commons.collections.CollectionUtils
。
Mavenの依存関係
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>