Null检查增强的for循环

时间:2010-02-12 06:25:23

标签: java syntax loops for-loop

在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,那么不要运行循环吗?

12 个答案:

答案 0 :(得分:213)

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

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

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

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

当然safe将是:

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

答案 1 :(得分:93)

如果传入null:

,您可能会编写一个返回空序列的辅助方法
public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

然后使用:

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

我不认为我实际上是这样做的 - 我通常会使用你的第二种形式。特别是,“或者抛出ex”很重要 - 如果它真的不应该为null,那么你肯定应该抛出异常。你知道某些东西出错了,但是你不知道损坏的程度。早点中止。

答案 2 :(得分:25)

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

用法:

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

您可以使用CollectionUtils.emptyIfNull对其他Collection类执行相同的空值安全检查。

答案 3 :(得分:7)

如果您从实施的方法调用中获取List,则不要返回null,请返回空List

如果您无法更改实施,那么您将坚持使用null检查。如果它不应该是null,那么抛出异常。

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

答案 4 :(得分:7)

使用ArrayUtils.nullToEmpty库中的commons-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项目页面。以下是nullToEmpty API documentationsource

Maven条目在您的项目中包含commons-lang(如果尚未包含)。

<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;
}

答案 5 :(得分:7)

使用Java 8 Optional

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

答案 6 :(得分:4)

我修改了上面的答案,因此您不需要从Object

进行强制转换
public static <T> List<T> safeClient( List<T> other ) {
            return other == null ? Collections.EMPTY_LIST : other;
}

然后只需通过

调用List
for (MyOwnObject ownObject : safeClient(someList)) {
    // do whatever
}

阐释: MyOwnObject:如果是List<Integer>,那么在这种情况下MyOwnObject将是Integer。

答案 7 :(得分:1)

有效防止for循环中的null的另一种方法是用Google Guava的Optional<T>包装你的集合,因为这样做,人们希望,有效空集合的可能性是明确的,因为客户端会被期望检查该集合是否与Optional.isPresent()一起出现。

答案 8 :(得分:1)

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

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

ObjectUtils.defaultIfNull JavaDoc

答案 9 :(得分:0)

使用,CollectionUtils.isEmpty(Collection coll)方法,如果指定的集合为空,则为Null-safe检查。

这个import org.apache.commons.collections.CollectionUtils

Maven依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

答案 10 :(得分:0)

“||”或者 ”??”在这里派上用场

最佳选择和 IE 兼容是 ||

function counter(value, limit) {
  if(value === limit) {
    console.log(value);
  } else {
    console.log(value); // on the way down / going deeper (increment)
    counter(value+1, limit);
    console.log(value); // on the way up / coming up from the depths (decrement)
  }
}

counter(0,10);
// 0, 1, 2, 3 ... 10, 9, 8... 0

Nullish coalescing operator不兼容 IE

for (Object object : someList || []) {
    // undefined and null gets defaulted to an empty array []
}

答案 11 :(得分:-3)

for (Object object : someList) {

   // do whatever
}  throws the null pointer exception.