为什么 java.lang.Iterable.forEach() 调用 requireNonNull()?
Why does java.lang.Iterable.forEach() invoke requireNonNull()?
这是在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
,则总是抛出 NullPointerException
。
你自己回答了:如果可迭代对象为空,方法仍然必须抛出一个NullPointerException
。 Quote:
Throws:
NullPointerException
- if the specified action is null
这是在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
,则总是抛出 NullPointerException
。
你自己回答了:如果可迭代对象为空,方法仍然必须抛出一个NullPointerException
。 Quote:
Throws:
NullPointerException
- if the specified action is null