web-dev-qa-db-ja.com

拡張forループのヌルチェック

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ならループを実行しないでください?

161
fastcodejava

そのリストの取得元を確認する必要があります。

空のリストは失敗しないため、空のリストで十分です。

他のどこかからこのリストを取得し、それが大丈夫かどうかわからない場合は、ユーティリティメソッドを作成して次のように使用できます。

for( Object o : safe( list ) ) {
   // do whatever 
 }

そしてもちろんsafeは次のようになります:

public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}
215
OscarRyz

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が間違っていることは知っていますが、損傷の程度はわかりません。早めに中止します。

96
Jon Skeet

すでに2017年であり、 Apache Commons Collections4 を使用できるようになりました

使用法:

for(Object obj : ListUtils.emptyIfNull(list1)){
    // Do your stuff
}

CollectionUtils.emptyIfNullを使用して、他のCollectionクラスに対して同じnullセーフチェックを実行できます。

25
Fred Pym

実装するメソッド呼び出しからListを取得する場合は、nullを返さないで、空のListを返します。

実装を変更できない場合は、nullチェックを使用する必要があります。 nullであってはならない場合、例外をスローします。

空のリストを返すヘルパーメソッドは使用しない場合がありますが、それは時々役立つことがありますが、バグを隠す可能性のあるすべてのループでそれを呼び出すことに慣れるでしょう。

7
Lombo

配列には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 AP​​Iです ドキュメント および ソース

プロジェクトにcommons-langを含めるMavenエントリ(まだない場合)。

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

残念ながら、commons-langList型に対してこの機能を提供しません。この場合、前述のヘルパーメソッドを使用する必要があります。

public static <E> List<E> nullToEmpty(List<E> list)
{
    if(list == null || list.isEmpty())
    {
        return Collections.emptyList();
    }
    return list;
}
7
sdc

Java 8 Optionalの場合:

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}
7
holmis83

上記の答えを修正したので、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は整数になります。

4
Haris Iltifat

独自の静的ヌル安全メソッドを書くことに興味のない人には、commons-langのorg.Apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)を使用できます。例えば:

    for (final String item : 
    (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

ObjectUtils.defaultIfNull JavaDoc

1
Jacob Briscoe

Forループでnullを効果的に防ぐもう1つの方法は、Google Guavaの Optional<T> でコレクションをラップすることです。これは、クライアントがOptional.isPresent()でコレクションが存在するかどうかを確認します。

1
Nico de Wet

指定されたコレクションが空かどうかを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>
0
Swadeshi