代码之家  ›  专栏  ›  技术社区  ›  Mike Nakis

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

  •  1
  • Mike Nakis  · 技术社区  · 11 年前

    这是在 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;
    }
    

    按照我的理解,如果可迭代的是非空的,并且我传递了一个空操作,它将抛出一个空指针异常 无论如何 ,那么检查操作,如果发现为空,则抛出完全相同的异常,有什么意义呢?

    2 回复  |  直到 11 年前
        1
  •  4
  •   Sergey Kalinichenko    11 年前

    这样做是为了在可迭代项为空和非空的情况下实现一致的行为。如果不预先进行此检查,则当您通过时,该方法将成功完成 null 操作,但可迭代项为空。

    然而,这将与文件相矛盾,文件中指出 NullPointerException 如果指定的操作为 无效的 .

        2
  •  2
  •   Marko Topolnik    11 年前

    您自己回答:如果iterable为空,则该方法仍必须抛出 NullPointerException . Quote :

    投掷:
    空指针异常 -如果指定的操作为空