增强了对象的循环和空检查

时间:2014-11-05 14:44:59

标签: java for-loop foreach

假设我有以下代码:

for (AnyObject anyObject : anyObjectList) {
    System.out.println(anyObject.doSomething());
}

我的问题是:我读到可以将null添加到至少某种类型的列表类型中。 如果我正确:在访问迭代类的方法之前,不应该总是进行空检查吗? 我只是问,因为我从来没有见过一个增强的for循环与这样的空检查,例如:

for (AnyObject anyObject : anyObjectList) {
    if (anyObject != null) {
        System.out.println(anyObject.doSomething());
    }
}

3 个答案:

答案 0 :(得分:3)

实际上,您通常想知道列表中是否存在随机null。您的第一个代码段会抛出一个异常来指示问题,但是您的第二个代码段将默默消耗该错误。

您也可以这样做:

for (AnyObject anyObject : anyObjectList) {
    if (anyObject != null) {
        System.out.println(anyObject.doSomething());
    } else {
        /* something went wrong -- report error, debugging info, etc. */
    }
}

答案 1 :(得分:0)

如果您不想在列表中显示null,那么大多数Queue实施(除LinkedList之外的明显例外)都不接受null

或者你也可以 使用Constraints

import com.google.common.collect.Constraints;
...
Constraints.constrainedList(new ArrayList(), Constraints.notNull())

来自Guava以获得最大的灵活性。


更好的做事方式是

try {
    for (AnyObject anyObject : anyObjectList) {
        System.out.println(anyObject.doSomething());
    }
} catch (NullPointerException npe){
        // Do your logging here !
}

答案 2 :(得分:0)

for (AnyObject anyObject : anyObjectList) {
    if (anyObject != null) {
        System.out.println(anyObject.doSomething());
    } else {
        /* something went wrong -- report error, debugging info, etc. */
    }
}

这是一种非常糟糕的空检查方法。当出现null时,第2行不会执行事件。

StackFlowed的答案更好。

try {
    for (AnyObject anyObject : anyObjectList) {
        System.out.println(anyObject.doSomething());
    }
} catch (NullPointerException npe){
        // Do your logging here !
}

但我们可能必须跳过null并获取其他值。所以我找到了解决方案。代码必须是这样的:

for (AnyObject anyObject : checkIsEmpty(anyObjectList)) {
        System.out.println(anyObject.doSomething());
}

private <T> Iterable<T> checkIsEmpty(Iterable<T> iterable) {
        return iterable == null ? Collections.<T>emptyList() : iterable;
}