Interface List的迭代器方法是否可以返回null?
我注意到很多时候人们为list.iterator添加空检查。我们真的需要这张支票。
Javadocs没有提到迭代器返回null,所以想要确认。
link:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#iterator()
答案 0 :(得分:8)
List
是一个界面。 List.iterator()
是否可以返回null
取决于您正在使用的接口List
的实现。
java.util.ArrayList
和java.util.LinkedList
等标准类的实现永远不会返回null
,因此如果您使用这些,则无需检查List.iterator()
是否返回{{1} }}
您可以通过查看这些类的源代码来确认这一点,您可以在JDK安装目录的文件null
中找到它们。
原则上可能有一个奇怪的接口src.zip
实现会返回List
,但这很奇怪,而不是开发人员对null
的期望。< / p>
答案 1 :(得分:2)
不,list.iterator()不能返回null。它将始终返回类型为Iterable的类的对象(实现Iterable接口)。
即使在源代码中:方法iterator()
通过使用new关键字返回新的可迭代对象,因此不存在null的可能性。下面是ArrayList类的iterator()方法的代码:
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
*
* @return an iterator over the elements in this list in proper sequence
*/
public Iterator<E> iterator() {
return new Itr();
}
此处Itr is a inner class defined in ArrayList
类本身。
我在JDk源代码中看到了一些List实现,我发现在任何地方都使用new关键字来返回迭代器对象,所以我认为不需要对list.iterator()进行null检查。
即使我在IntelliJ IDE中尝试了下面的代码,然后我在IDE信息中发现:“Condition 'iterator != null' is always 'true'
”
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
if(iterator != null) {
System.out.println("");
}