195

在 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 则不运行循环?

4

11 回答 11

245

您应该更好地验证您从哪里获得该列表。

您只需要一个空列表,因为空列表不会失败。

如果您从其他地方获得此列表并且不知道它是否可以,您可以创建一个实用程序方法并像这样使用它:

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

当然safe是:

public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}
于 2010-02-12T06:30:50.613 回答
102

如果您传入 null,您可能会编写一个返回空序列的辅助方法:

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

然后使用:

for (Object object : emptyIfNull(someList)) {
}

不过,我认为我实际上不会这样做-我通常会使用您的第二种形式。特别是,“or throw ex”很重要——如果它真的不应该为空,你肯定应该抛出一个异常。您知道出问题,但您不知道损坏的程度。提前中止。

于 2010-02-12T06:30:05.463 回答
36

已经是 2017 年了,您现在可以使用Apache Commons Collections4

用法:

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

您可以使用CollectionUtils.emptyIfNull.

于 2017-05-18T03:03:22.863 回答
12

使用 Java 8 Optional

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}
于 2017-08-17T12:29:20.587 回答
11

ArrayUtils.nullToEmptycommons-lang库中使用数组

for( Object o : ArrayUtils.nullToEmpty(list) ) {
   // do whatever 
}

此功能存在于commons-lang大多数 Java 项目中包含的库中。

// 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项目页面。这是nullToEmptyAPI文档

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;
}
于 2016-08-24T19:00:02.713 回答
8

如果你是List从你实现的方法调用中得到的,那么不要 return null,返回一个 empty List

如果您无法更改实施,那么您将被卡住null。如果不应该null,则抛出异常。

我不会选择返回空列表的辅助方法,因为它有时可能很有用,但是你会习惯在每个循环中调用它,你可能会隐藏一些错误。

于 2010-02-12T06:34:35.440 回答
4

我已经修改了上面的答案,所以你不需要从 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: If List<Integer>then MyOwnObject 将是 Integer 在这种情况下。

于 2015-08-13T15:11:30.500 回答
3

对于任何对编写自己的静态空安全方法不感兴趣的人,您可以使用:commons-lang's org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)。例如:

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

ObjectUtils.defaultIfNull JavaDoc

于 2016-09-14T17:57:14.753 回答
1

在 for 循环中有效防止 null 的另一种方法是用 Google Guava 包装您的集合,Optional<T>因为人们希望这样可以明确有效地为空集合的可能性,因为客户端需要检查集合是否与Optional.isPresent().

于 2013-08-29T02:11:33.673 回答
0

使用CollectionUtils.isEmpty(Collection coll)Null 安全的方法检查指定的集合是否为空。

为此import org.apache.commons.collections.CollectionUtils

Maven依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>
于 2017-11-03T14:08:57.657 回答
-5
for (Object object : someList) {

   // do whatever
}  throws the null pointer exception.
于 2016-05-10T13:06:35.253 回答