为什么java.lang.Iterable.forEach()会调用requireNonNull()?

时间:2015-02-12 14:44:14

标签: java exception nullpointerexception java-8

这是java.lang.Iterable

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

这是java.util.Objects.requireNonNull()

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

我理解它的方式,如果iterable是非空的,并且我传递一个null动作,它将抛出一个空指针异常无论如何,那么检查动作的重点是什么,如果发现为null,则抛出完全相同的异常?

2 个答案:

答案 0 :(得分:4)

这样做是为了在iterable为空和非空时的情境之间实现一致的行为。如果不事先进行此检查,则在传递null操作时该方法将成功完成,但是iterable为空。

但是,这与文档相矛盾,后者表示如果指定的操作是NullPointerException,则始终会抛出null

答案 1 :(得分:2)

你自己回答:如果iterable为空,那么该方法仍然必须抛出NullPointerExceptionQuote

  

<强>抛出:
  NullPointerException - 如果指定的操作为空